web-dev-qa-db-ja.com

Python / psycopg2 WHERE INステートメント

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

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

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

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

ありがとう

55
Matt

IN演算子の場合、 list ではなく Tuple を使用し、SQL文字列から括弧を削除します。

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

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

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

cur.mogrify(sql, (data,))
90
Bryan

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

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.
})
25
Joshua Burns

以下のように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

0
Praveen KR