🚀

GormでIN句を使ってエラーが出た時の解決策

2021/10/17に公開

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 ] 

before(エラー発生時のコード)

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

対応策:?を括弧で囲む

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

最後に

https://gorm.io/docs/query.html
公式に別に (?) のように ? を () で囲えと書いてないので、詰まってしまった。
※むしろ普通にsliceをそのままINの条件に入れてるように見えたので、その通りに従った。
 
すると上記のSQL構文エラーが出たので、少し調査・分析し自己解決に至った。
ネットにこのエラーに遭遇して記事にしてる人を見受けなかったので、
同じエラーが出てる人のために記事にしたほうがいいと思い、記事にしました。
 
gormのlog modeをtrueにしてたので解決に至った!log mode 最高!
開発中は常にログモードをtrueにしようと改めて誓った日であった。

	db.LogMode(true)

Discussion