2017-10-12 84 views
0

私は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のスライスです。

+0

*決して*クエリを作成するための文字列補間を使用しないでください。少なくとも慎重にすべてを引用することなく、少なくとも。これは大量のSQLインジェクションの餌です。代わりにバインドパラメータを使用してください。例えばhttps://godoc.org/github.com/lib/pq#Array –

+2

['lib/pq'](https://github.com/lib/pq)を使用していますか?パラメータのプレースホルダの '?'ではなく、 '$ 1、$ 2 ...'を試してください。 – putu

+0

結果クエリ全体を表示できますか?データベースエラーログに記録されている可能性があります。 IN照会に特殊な補間を使用してみてください。 –

答えて

0

代わりに、プレースホルダとして$ 1、$ 2などを使用しました。

+0

Postgresは '? 'プレースホルダを受け入れません。しかし、[sqlx](https://github.com/jmoiron/sqlx)を使用すると、任意の言語( ':entry_id'のような名前付きパラメタだけでなく)で'? 'を使用して、それらを再マップすることができます'Rebind() 'を介して問題の言語に変換します。 SQLクエリーを(構造に直接スキャンする機能のように)迷惑にならないようにする他の機能がたくさんあります。 – Kaedys

関連する問題