Daily/2021/02/06

2021-02-06

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 周りだったり諸々修正してとりあえず動くとこまで確認できた。

[Todo]

その他作業中に発生したこと

Next

logs

Satoshi Koizumi

Daily/2021/02/08

Daily/2021/02/04