Подтвердить что ты не робот

Инструкция Python/psycopg2 WHERE IN

Каков правильный метод, чтобы список (countryList) был доступен через% s в инструкции SQL?

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

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

Как и сейчас, он ошибается после попытки запустить "WHERE country in (ARRAY [...])". Есть ли способ сделать это, кроме как с помощью строковых манипуляций?

Спасибо

4b9b3361

Ответ 1

Для оператора IN вы хотите tuple вместо list, и удалите скобки из строки SQL.

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

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

Во время отладки вы можете проверить правильность построения SQL с помощью

cur.mogrify(sql, (data,))

Ответ 2

Чтобы немного объяснить ответ и задать именованные параметры и преобразовать списки в кортежи:

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.
})

Ответ 3

Вы можете использовать список Python напрямую, как показано ниже. Он действует как оператор IN в SQL, а также обрабатывает пустой список без каких-либо ошибок.

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

источник: http://initd.org/psycopg/docs/usage.html#lists-adaptation