Python / psycopg2 WHEREINステートメント


81

SQLステートメントの%sを介してリスト(countryList)を使用できるようにする正しい方法は何ですか?

# using psycopg2
countryList=['UK','France']

sql='SELECT * from countries WHERE country IN (%s)'
data=[countryList]
cur.execute(sql,data)

現在のように、「WHERE country in(ARRAY [...])」を実行しようとするとエラーが発生します。文字列操作以外にこれを行う方法はありますか?

ありがとう

回答:


133

以下のためにINオペレータ、あなたがしたいタプルの代わりのリストを、およびSQL文字列からかっこを削除します。

# using psycopg2
data=('UK','France')

sql='SELECT * from countries WHERE country IN %s'
cur.execute(sql,(data,))

デバッグ中に、SQLが正しく構築されていることを確認できます。

cur.mogrify(sql, (data,))

迅速な対応に感謝致します!
マット

1
この回答を読んだ後でも問題が発生した場合は、ゆっくりともう一度読んでください。これはタプルのタプルであり、%sの周りにあるパランがある場合は、それらを削除する必要があります。私のより単純なテストでは単一の値しか使用せず、すべてが機能したため、これは私をつまずかせました。ブライアンが書いたとおりにこれに従ってください。
zachaysan

40

答えを少し説明し、名前付きパラメーターに対処し、リストをタプルに変換するには:

countryList = ['UK', 'France']

sql = 'SELECT * from countries WHERE country IN %(countryList)s'

cur.execute(sql, { # You can pass a dict for named parameters rather than a tuple. Makes debugging hella easier.
    'countryList': tuple(countryList), # Converts the list to a tuple.
})

1
口述を渡すためのヒントをありがとう。それははるかに優れています。
ジャック

これは、辞書内の複数のWHERE x IN句と複数のリストを使用して実装できますか?
Odisseo

1
訂正:@Odisseoはい、全能のORで。例えば:cur.execute("SELECT * FROM table WHERE col IN %(list1)s OR col IN %(list2)s", {'list1': tuple(1,2,3), 'list2' = tuple(4,5,6)})
ジョシュア・バーンズ

12

以下のように、Pythonリストを直接使用できます。SQLのIN演算子のように機能し、エラーをスローせずに空白のリストを処理します。

data=['UK','France']
sql='SELECT * from countries WHERE country = ANY (%s)'
cur.execute(sql,(data,))

ソース:http//initd.org/psycopg/docs/usage.html#lists-adaptation


また、受け入れ答えを使用していますが、持つことができます cur.execute(sql, (tuple(data),))
アダム・ヒューズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.