はじめに
gormでintのカラムを0で更新しようと思ったらできなかったので、調べた内容をメモ。
現象
Usersテーブルの内容が以下だったとして
id | num |
---|---|
1 | 1 |
type User struct {
ID int
Num int
}
func test() {
u := User{ID: 1, Num: 0}
db, _ := gorm.Open(...)
defer db.Close()
savedData := []User{}
db = db.Where("id = ?", u.ID)
db.Find(&savedData)
db = db.Model(&savedData[0]).Update(&u)
}
testを実行すれば、id = 1
の行のnum列を0
で更新して欲しいのですが、してくれません…
やり方
gormでは、更新対象のオブジェクトの値がゼロ値だった場合更新対象から外れるようです。なので、前述の記事と同様にゼロ値が入りうる項目をポインタにすればOKです。
この場合はNum
なので、以下のように修正すれば0で更新できるようになります。
type User struct {
ID int
Num *int
}
func test() {
num := 0
u := User{ID: 1, Num: &num}
db, _ := gorm.Open("")
defer db.Close()
savedData := []User{}
db = db.Where("id = ?", u.ID)
db.Find(&savedData)
db = db.Model(&savedData[0]).Update(&u)
}