goroumaru41gou

遊んでいる中でインプットした内容をアウトプットする場

GORMでハマらないために【UPDATE編】

GORMを利用していて、UPDATEにハマったので備忘録とする。

取り扱うもの

GORMについて

UPDATE

GORMでは、updateクエリを流したいとき、大きくSaveとUpdateに分類できる。Updateを利用したところ、以下の問題があった。また、Saveにも注意点がある。

【Updateメソッド】デフォルト値でUpdateできない

例えば、int=0でUpdateしようとしても、アップデートされない。

解決策1

変更したいデータをmap[string]interface{}へBindしてからUpdateメソッドを使う。

// Bind
dataMap := map[string]interface{}{
    "ID":        data.ID,
    "Pair":      data.Pair,
    "Side":      data.Side,
}
r.db.Model(&orderPosition).Where(Test{ID: targetID}).UpdateColumns(dataMap)

解決策2

メンバーをポインタ渡しにすれば、0値アップデートできるようだけど、データベースへ保存するmodelsをこの形式へ変更するのは、個人的に抵抗ある。

type test struct {
    ID        *string
    Pair      string
    Side      string
}

【Saveメソッド】該当IDなしのとき、新規データでCreateされてしまう

アップデートのつもりでSaveを利用したら、Createされてる・・・

解決策1

元も子もないけど、可能な限りUpdateメソッドを使う。

解決策2

該当IDのレコードが存在することを確認してから、Saveメソッドを使う。ひと手間かかる・・・

参考