Python / psycopg2 WHERE IN语句


81

通过SQL语句中的%s提供列表(countryList)的正确方法是什么?

# using psycopg2
countryList=['UK','France']

sql='SELECT * from countries WHERE country IN (%s)'
data=[countryList]
cur.execute(sql,data)

现在,尝试运行“(ARRAY [...])所在的国家/地区”后,它会出错。除了通过字符串操作之外,还有其他方法吗?

谢谢

Answers:


133

为了 IN运算符,您需要一个元组而不是list,并从SQL字符串中除去括号。

# using psycopg2
data=('UK','France')

sql='SELECT * from countries WHERE country IN %s'
cur.execute(sql,(data,))

在调试期间,您可以检查SQL是否正确构建

cur.mogrify(sql, (data,))

感谢您及时的回复!
马特2015年

1
如果即使在阅读完此答案后仍遇到麻烦,请重新阅读,然后再慢慢阅读。这是一个元组的元组,如果您在%s周围,则必须删除它们。这让我感到震惊,因为我的一个更简单的测试仅使用单个值,并且一切正常。完全按照Bryan所说的那样进行。
zachaysan

40

为了稍微解释答案并解决命名参数,并将列表转换为元组:

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

1
感谢您提供传递字典的提示。那好多了。
杰克

可以使用字典中的多个WHERE x IN子句和多个列表来实现吗?
奥迪塞奥

1
更正:@Odisseo是的,具有全能的OR。例如: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)})
Joshua Burns

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.