私はgolangでpostgres IN句を使用しようとしていますが、エラーが続いています。これは実行したいクエリです。golangのpostgres IN句を使用する
SELECT id1 FROM my_table WHERE type = (an int) AND id2 = (an int) AND id1 IN (list of UUIDs)
このコードを使用してこのクエリを構成しましたが、次のエラーが発生しました。
var params []interface{}
inCondition := ""
params = append(params, type)
params = append(params, id2)
for _, id := range id1 {
params = append(params, id)
if inCondition != "" {
inCondition += ", "
}
inCondition += "?"
}
query := fmt.Sprintf(`SELECT id1 FROM my_table WHERE type = ? AND id2 = ? AND id1 IN (%s)`, inCondition)
rows, err := db.Query(query, params...)
クエリIました:
SELECT id1 FROM my_table WHERE type = ? AND id2 = ? AND id1 IN (?, ?, ?)
のparams出力:
[]interface {}=[0 7545449 d323f8d5-ab97-46a3-a34e-95ceac2f3a6a d323f8d5-ab97-46a3-a34e-95ceac2f3a6b d323f8d5-ab97-46a3-a34e-95ceac2f3a6d]
エラー:
pq: syntax error at or near \"AND\""
私は何をしないのですか?または、これをどのように機能させるのですか? id1は長さが可変のUUIDのスライスです。
*決して*クエリを作成するための文字列補間を使用しないでください。少なくとも慎重にすべてを引用することなく、少なくとも。これは大量のSQLインジェクションの餌です。代わりにバインドパラメータを使用してください。例えばhttps://godoc.org/github.com/lib/pq#Array –
['lib/pq'](https://github.com/lib/pq)を使用していますか?パラメータのプレースホルダの '?'ではなく、 '$ 1、$ 2 ...'を試してください。 – putu
結果クエリ全体を表示できますか?データベースエラーログに記録されている可能性があります。 IN照会に特殊な補間を使用してみてください。 –