Open6

Go ORM Knowledge

SoraSora

dbr

execは成功してるけど、DBに値が入らんとき。
tx.Commit()ができてない(可能性が大)

(失敗)

[2021-06-21T11:00:39.8453421Z]: job:general event:dbr.begin
[2021-06-21T11:00:39.8467721Z]: job:general event:dbr.exec time:1197 μs kvs:[sql:INSERT INTO `t_invoice` (`id`,`client_id`,`tax_excluded`,`tax_rate`,`service`,`target_month`,`created_at`) VALUES (0,2,1000,10,'stripe','2021-07','2021-06-21 11:00:39.837848')]

(成功)

[2021-06-21T11:07:51.3444854Z]: job:general event:dbr.exec time:1285 μs kvs:[sql:INSERT INTO `t_invoice` (`id`,`client_id`,`tax_excluded`,`tax_rate`,`service`,`target_month`,`created_at`) VALUES (0,2,1000,10,'stripe','2021-07','2021-06-21 11:07:51.341642')]
[2021-06-21T11:07:51.3463542Z]: job:general event:dbr.commit
SoraSora

想定外のエラーの際

想定外のエラーでlogが不十分な際はdebug用のlogが埋め込めるか確認する。
「これやったらいけるかな?」は2回まで。それ以上はやらない。
きちんとlog埋めて、logの結果見て原因を突き止めること!!
gorm のLogMode(true)にしたら一発で原因が分かった。

	db.LogMode(true)
SoraSora

GormでINを使う時

stringslice 型をIN句で使うときは ? の部分を括弧で括ってあげないと、SQL構文エラーになる。

エラー文

[2021-10-17 08:00:06]  Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?,?,?,?,?,?,?)' at line 1 

(/app/infra/mysql/t_works.go:21) 
[2021-10-17 08:00:06]  [0.50ms]  SELECT * FROM `t_works`  WHERE (uuid IN 'ayT26n5uOBJVRS','RbfnBB3DQQrVXbQns1','dCaElk4mrpjph6rx2','8nKhTk9dFI5A','1EkmFP2imIso23','vGrj5RVqw3EoeF7vSGg','ygx8ffvUsywB4Vy')  
[0 rows affected or returned ] 

対応策:?を括弧で囲む

func FetchWorksByUUIDs(uuids []string) ([]models.Work, error) {
 // 中略
	db.Where("uuid IN (?)", uuids).Find(&works)
}