Python/psycopg2 ГДЕ В заявлении
Какой правильный способ сделать список (countryList) доступным через%s в операторе SQL?
# using psycopg2
countryList=['UK','France']
sql='SELECT * from countries WHERE country IN (%s)'
data=[countryList]
cur.execute(sql,data)
Как и сейчас, выдает ошибку после попытки запустить "ГДЕ страна в (ARRAY[...])". Есть ли способ сделать это, кроме как через манипуляции со строками?
Спасибо
5 ответов
Для IN
Оператор, вы хотите кортеж вместо списка, и удалить скобки из строки SQL.
# using psycopg2
data=('UK','France')
sql='SELECT * from countries WHERE country IN %s'
cur.execute(sql,(data,))
Во время отладки вы можете проверить, что SQL построен правильно с
cur.mogrify(sql, (data,))
Чтобы немного развернуть ответ и обратиться к именованным параметрам и преобразовать списки в кортежи:
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.
})
Вы можете использовать список 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
Поскольку вопрос psycopg3 был помечен как дубликат, я также добавлю ответ на него здесь.
В psycopg3 нельзя использоватьin %s
с кортежем, как в psycopg2. Вместо этого вы должны использоватьANY()
и оберните свой список внутри другого списка:
conn.execute("SELECT * FROM foo WHERE id = ANY(%s)", [[10,20,30]])
Документы: https://www.psycopg.org/psycopg3/docs/basic/from_pg2.html#you-cannot-use-in-s-with-a-tuple
я использую'row_factory': dict_row
и для меня работает следующее:
SQL:... where col_name = ANY(%(col_name)s);
Питон:connection.execute(sql, {'col_name': ['xx',...,'yy']})