Каков правильный метод, чтобы список (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 [...])". Есть ли способ сделать это, кроме манипуляций со строками?
благодаря
Чтобы немного пояснить ответ и обратиться к именованным параметрам и преобразовать списки в кортежи:
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. })
источник
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)})
Вы можете использовать список 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
источник
cur.execute(sql, (tuple(data),))