gormのUpdateメソッドについてそれぞれ違いがあるので表にまとめてみた。
GORMの更新メソッドの違い
メソッド | 更新対象 |
UpdatedAt の自動更新 |
ゼロ値の扱い(数値型の0、空文字、boolのfalse など) | 主な用途 |
---|---|---|---|---|
Save |
全フィールド | する | 更新される | 全フィールドの更新、新規レコードの保存 |
Update |
単一フィールド | する | 更新される | 特定のフィールドの更新 |
Updates |
複数フィールド | する |
構造体: 無視される マップ: 更新される |
複数のフィールドの更新 |
UpdateColumns |
複数のフィールドの更新 | しない | 無視される | 複数のフィールドの更新 |
ゼロ値の更新の部分はゼロ値を正しく理解してないとハマる。例えば、ポインタ型の場合は、nilがゼロ値になるということを意識しておく必要がある。
例えば
sample
abc struct {
isTest bool
isProd *bool
}
db.Model(&sample).UpdateColumns(User{isTest: false, isProd: false})
// 生成されるSQLのset句にゼロ値が除外される。ポインタ型はnilがゼロ値でこの場合は除外されない。
// update sample set isProd = false
関連ドキュメント
https://gorm.io/docs/update.html
ゼロ値について
https://qiita.com/tenntenn/items/c55095585af64ca28ab5