🚀
GormでIN句を使ってエラーが出た時の解決策
GormでINを使う時
string
の slice
型を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)
}
最後に
(?)
のように ? を () で囲えと書いてないので、詰まってしまった。
※むしろ普通にsliceをそのままINの条件に入れてるように見えたので、その通りに従った。
すると上記のSQL構文エラーが出たので、少し調査・分析し自己解決に至った。
ネットにこのエラーに遭遇して記事にしてる人を見受けなかったので、
同じエラーが出てる人のために記事にしたほうがいいと思い、記事にしました。
gormのlog modeをtrueにしてたので解決に至った!log mode 最高!
開発中は常にログモードをtrueにしようと改めて誓った日であった。
db.LogMode(true)
Discussion