Python/psycopg2 WHERE IN 语句

问题描述 投票:0回答:5

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

谢谢

python psycopg2 where-in
5个回答
197
投票

对于

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,))
    

59
投票
稍微解释一下答案并解决命名参数,并将列表转换为元组:

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

20
投票
您可以直接使用 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


7
投票
由于 psycopg3 问题被标记为重复,我也会在这里添加答案。

在 psycopg3 中,您不能像在 psycopg2 中那样将

in %s

 与元组一起使用。相反,您必须使用 
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


0
投票
我正在使用

'row_factory': dict_row

,以下内容对我有用:

SQL:

... where col_name = ANY(%(col_name)s);


Python:

connection.execute(sql, {'col_name': ['xx',...,'yy']})


    

© www.soinside.com 2019 - 2024. All rights reserved.