Todo
Todo | Done |
---|---|
API 作る |
Log
API 作る
大体フレームはできてきたがエラーハンドリング周りがうまくいってないので引き続き調べる。
gorm の Delete
gorm の DELETE 処理を以下のように書いた。
if err := conn.Delete(models.GroupMember{}).Where("group_id = ?", d.ID()).Error; err != nil {
return err
}
発行された SQL がこれ。
DELETE FROM `group_members`
全消ししてますやん。実装間違えてる。。
gorm の ドキュメントを改めて読んで見る。
https://gorm.io/ja_JP/docs/delete.html#Block-Global-Delete
If you perform a batch delete without any conditions, GORM WON’T run it, and will return ErrMissingWhereClause error
You have to use some conditions or use raw SQL or enable AllowGlobalUpdate mode, for example:
あれ、なんか AllowGlobalUpdate mode じゃないと動かないって書いてあるけど、、うん?
引数がポインタじゃないのが関係するのか?と思ってやってみたけどだめ。バージョンかな。
https://gorm.io/docs/v2_release_note.html
GORM V2 enabled BlockGlobalUpdate mode by default, to trigger a global update/delete, you have to use some conditions or use raw SQL or enable AllowGlobalUpdate mode, for example:
使ってるの 1.9.12 だった。古すぎる・・・
最新版入れたらエラーになった箇所を並べていく。
if gorm.IsRecordNotFoundError(err) {
これは、最新版だと errors.Is で比較する。
errors.Is(err, gorm.ErrRecordNotFound)
Transaction 周りだと defer で呼んでた Close がなくなってた。不要になったのかしら。
と思ったけど Close 消したら Connection が切れないなこれ。
一回 DB() で取得した後に Close が必要とのことでした。
connection 作るところも変わってた。浦島状態。。。
db, err := gorm.Open("mysql",
fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=true&loc=Asia%%2FTokyo",
d.user, d.password, d.host, d.port, d.dbname))
https://gorm.io/ja_JP/docs/connecting_to_the_database.html
// "gorm.io/driver/mysql" を import する
db, err := gorm.Open(mysql.Open(
fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=true&loc=Asia%%2FTokyo",
d.user, d.password, d.host, d.port, d.dbname)))
Logger 周りだったり諸々修正してとりあえず動くとこまで確認できた。