Beego、ormのリレーションがよくわからない。
GoのWeb開発でBeegoというフレームワークのormというORマッパを使用しています。そこで以下のモデルとハンドラを作成し、テストとして以下のリクエストをポストしました。しかし、データベースを調べてみるとHighThumbnailとMediumThumbnail以外はちゃんと記録されますが、その2つが登録されません。なぜでしょうか。
model
// 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"`
}
ハンドラ
//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))
}
}
}
リクエスト
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
レスポンスはつぎのようになります。
レスポンス
{"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}