Python/psycopg2 WHERE IN语句

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)

  • 请编辑此答案,因为它对于 `psycopg >= 3.0` 无效 - 请参阅 dzav 的评论或 mjuopperi 的答案 (5认同)
  • 请改用“任何”。请参阅该文档:https://www.psycopg.org/psycopg3/docs/basic/from_pg2.html#you-cannot-use-in-s-with-a-tuple (4认同)
  • 如果您在阅读此答案后仍遇到问题,请慢慢地重新阅读。它是一个元组的元组,如果 %s 周围有参数,则必须将其删除。这让我绊倒了,因为我的一个更简单的测试只使用了一个值,并且一切正常。只要完全按照布莱恩写下的去做就可以了。 (3认同)
  • 我收到错误“psycopg.errors.SyntaxError:语法错误位于或接近“$1”第 1 行:从国家/地区中选择*,其中国家/地区位于 $1” (2认同)

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

  • 有关此主题的更多信息可以在这里找到:https://www.psycopg.org/psycopg3/docs/basic/from_pg2.html (2认同)