Mat*_*att 62 python psycopg2 where-in
在SQL语句中通过%s使列表(countryList)可用的正确方法是什么?
# using psycopg2
countryList=['UK','France']
sql='SELECT * from countries WHERE country IN (%s)'
data=[countryList]
cur.execute(sql,data)
Run Code Online (Sandbox Code Playgroud)
就像现在一样,它在尝试运行"(ARRAY [...])中的WHERE国家"后出错.除了通过字符串操作之外,有没有办法做到这一点?
谢谢
Bry*_*yan 98
对于IN运算符,您需要一个元组而不是列表,并从SQL字符串中删除括号.
# using psycopg2
data=('UK','France')
sql='SELECT * from countries WHERE country IN %s'
cur.execute(sql,(data,))
Run Code Online (Sandbox Code Playgroud)
在调试期间,您可以检查SQL是否正确构建
cur.mogrify(sql, (data,))
Run Code Online (Sandbox Code Playgroud)
Jos*_*rns 26
要解释一下答案,并解决命名参数,并将列表转换为元组:
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.
})
Run Code Online (Sandbox Code Playgroud)
Pra*_*n27 16
您可以直接使用 python 列表,如下所示。它的作用类似于 SQL 中的 IN 运算符,还可以处理空白列表而不会引发任何错误。
data=['UK','France']
sql='SELECT * from countries WHERE country = ANY (%s)'
cur.execute(sql,(data,))
Run Code Online (Sandbox Code Playgroud)
来源:http : //initd.org/psycopg/docs/usage.html#lists-adaptation
mju*_*eri 11
由于 psycopg3 问题被标记为重复,我也会在这里添加答案。
在 psycopg3 中,您不能in %s像在 psycopg2 中那样使用元组。相反,您必须使用 ANY()列表并将其包装在另一个列表中:
conn.execute("SELECT * FROM foo WHERE id = ANY(%s)", [[10,20,30]])
Run Code Online (Sandbox Code Playgroud)
文档:https://www.psycopg.org/psycopg3/docs/basic/from_pg2.html#you-cannot-use-in-s-with-a-tuple