12491


GoのWeb開発でBeegoというフレームワークのormというORマッパを使用しています。そこで以下のモデルとハンドラを作成し、テストとして以下のリクエストをポストしました。しかし、データベースを調べてみるとHighThumbnailとMediumThumbnail以外はちゃんと記録されますが、その2つが登録されません。なぜでしょうか。

model

[code]

    // Video is model of YouTube videos.
    type Video struct {
        Id              int        `json:"id"`
        VideoId         string     `json:"videoId,omitempty" orm:"unique"`
        Title           string     `json:"title,omitempty"`
        Artist          string     `json:"artist,omitempty" orm:"null"`
        HighThumbnail   *Thumbnail `json:"highThumbnail,omitempty" orm:"rel(one);null"`
        MediumThumbnail *Thumbnail `json:"mediumThumbnail,omitempty" orm:"rel(one);null"`
        PublishedDate   time.Time  `json:"publishedDate,omitempty" orm:"null"`
        Created         time.Time  `json:"created" orm:"auto_now_add;type(datetime);null"`
        Updated         time.Time  `json:"updated" orm:"auto_now;type(datetime);null"`
        Liked           int        `json:"liked,omitempty"`
    }
    
    // Thumbnail is model of thumbnail of Video.
    type Thumbnail struct {
        Id     int    `json:"id"`
        URL    string `json:"url,omitempty" orm:"null"`
        Width  int    `json:"width,omitempty" orm:"null"`
        Height int    `json:"height,omitempty" orm:"null"`
    }
    
[/code]

ハンドラ

[code]

    //LikeをPOSTする関数。もし動画がなければ作成する。
    func likeUpdate(w http.ResponseWriter, r *http.Request) {
        o := orm.NewOrm()
    
        body, err := ioutil.ReadAll(io.LimitReader(r.Body, 1048576))
        checkError(w, err)
        if err := r.Body.Close(); err != nil {
            w.WriteHeader(400)
            utils.CheckError(w, err)
        }
    
        w = utils.SetJSONHeader(w)
    
        var video Video
    
        //jsonをパース
        if err := json.Unmarshal(body, &video); err != nil {
            w.WriteHeader(422)
            if err := json.NewEncoder(w).Encode(err); err != nil {
                utils.CheckError(w, err)
            }
        }
    
        //DBに保存
        if _, _, err := o.ReadOrCreate(&video, "videoId"); err == nil {
            video.Liked = video.Liked + 1
            if _, err := o.Update(&video); err == nil {
                w.WriteHeader(200)
                response, err := json.Marshal(video)
                utils.CheckError(w, err)
                fmt.Fprintln(w, string(response))
            }
        }
    }
    
[/code]

リクエスト

[code]

    curl -H "Content-Type: application/json" -d '{"title": "USFIV: Liquid NuckleDu vs Ai Ai - Evo 2015 - CPT 2131231", "highThumbnail":{"url":"url"}, "mediumThumbnail":{"url":"url"}, "videoId":"KU-jkDdwwwwwwq"}' http://localhost:9000/like
    
[/code]

レスポンスはつぎのようになります。

レスポンス

[code]

    {"id":8,"videoId":"KU-jkDdww","title":"USFIV: Liquid NuckleDu vs Ai Ai - Evo 2015 - CPT 2131231","highThumbnail":{"id":0,"url":"url"},"mediumThumbnail":{"id":0,"url":"url"},"publishedDate":"0001-01-01T00:00:00Z","created":"2015-07-19T18:48:39.650451031+09:00","updated":"2015-07-19T18:48:39.656141005+09:00","liked":1}
    
[/code]


CC BY-SA 3.0
2015-07-19T09:50:44.130
12479
2015-07-19T22:24:26.273
7232
question
go orm
Beego、ormのリレーションがよくわからない。


自己解決しました。

VideoをインサートしたあとでHighThumbnailもインサートする必要があるみたいです。

[code]

    //DBに保存
        if created, _, err := o.ReadOrCreate(&video, "videoId"); err == nil {
            if created {
                if video.HighThumbnail != nil {
                    o.Insert(video.HighThumbnail)
                }
                if video.MediumThumbnail != nil {
                    o.Insert(video.MediumThumbnail)
                }
            }
            video.Liked = video.Liked + 1
            if _, err := o.Update(&video); err == nil {
                w.WriteHeader(200)
                response, err := json.Marshal(video)
                utils.CheckError(w, err)
                fmt.Fprintln(w, string(response))
            }
        }
    
[/code]


CC BY-SA 3.0
2015-07-19T22:24:26.273
12491
2015-07-19T22:24:26.273
7232
12479
answer