Open4

【Go】db(gorm)

KeigoIbarakiKeigoIbaraki

Gorm update の挙動について

❗️ハマりポイント

https://gorm.io/ja_JP/docs/update.html#複数のカラムを更新する

Updates supports updating with struct or map[string]interface{}, when updating with struct it will only update non-zero fields by default

NOTE When updating with struct, GORM will only update non-zero fields. You might want to use map to update attributes or use Select to specify fields to update

ゼロ値での更新がされないため、対策が必要そう。
ゼロ値での更新をしたい場合(int:0 や bool:false は必要な結構ケースありそう)map を使うか Select updates をする必要があると記載があるが、pointer にする形でも解決はしそう

https://tapira.hatenablog.com/entry/2017/08/09/173718
https://tapira.hatenablog.com/entry/2017/08/11/182249

map にするとカラムの追加をする時とかに Update メソッドの追加を忘れたりしそうだから、ゼロ値で更新したいケースは pointer にする、の方が早そう

KeigoIbarakiKeigoIbaraki

Gorm Create

❗️ハマりポイント
Create では model に ID を詰めて返してくれるが、他のフィールドはその限りではない。作成後に作成された model を返したい場合は再度 Find する必要がある。

// returns inserted data's primary key

user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}

result := db.Create(&user) // pass pointer of data to Create

user.ID             // returns inserted data's primary key
result.Error        // returns error
result.RowsAffected // returns inserted records count

https://gorm.io/docs/create.html

KeigoIbarakiKeigoIbaraki

Gorm Where

❗️ハマりポイント

Where 句は Find や Create より先に書いていないと無視されるので注意