Python/psycopg2 WHERE IN 语句

Python/psycopg2 WHERE IN statement

通过 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[...])" 后出错。除了通过字符串操作之外,还有其他方法可以做到这一点吗?

谢谢

对于 IN 运算符,您需要一个 tuple instead of list,并从 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 列表,如下所示。它的作用类似于 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