python - 将参数传递给 DB .execute for WHERE IN... INT list

标签 python postgresql pg8000

使用 Python 的 DB API 规范,您可以将参数参数传递给 execute() 方法。我的语句的一部分是 WHERE IN 子句,我一直在使用元组来填充 IN。例如:

params = ((3, 2, 1), )
stmt = "SELECT * FROM table WHERE id IN %s"
db.execute(stmt, params)

但是遇到参数tuple只有1个item的情况,执行失败。

ProgrammingError: ERROR: syntax error at or near ")"
LINE 13: WHERE id IN (3,)

我怎样才能让元组正确地使用子句?

最佳答案

编辑:如果您认为此答案规避了针对 SQL 注入(inject)攻击的内置保护,那您就错了;仔细观察。

使用 pg8000 进行测试(与 PostgreSQL 数据库引擎兼容的 DB-API 2.0 纯 Python 接口(interface)):

这是将多个参数传递给“IN”子句的推荐方法。

params = [3,2,1]
stmt = 'SELECT * FROM table WHERE id IN (%s)' % ','.join('%s' for i in params)
cursor.execute(stmt, params)

完整示例:

>>> from pg8000 import DBAPI
>>> conn = DBAPI.connect(user="a", database="d", host="localhost", password="p")
>>> c = conn.cursor()
>>> prms = [1,2,3]
>>> stmt = 'SELECT * FROM table WHERE id IN (%s)' % ','.join('%s' for i in prms)
>>> c.execute(stmt,prms)
>>> c.fetchall()
((1, u'myitem1'), (2, u'myitem2'), (3, u'myitem3'))

关于python - 将参数传递给 DB .execute for WHERE IN... INT list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2253494/

相关文章:

postgresql - Postgres 9.3 - 新功能上的新角色的模式错误权限被拒绝

postgresql - 列 "statement_date"是日期类型,但表达式是整数类型

azure - 对我的服务器的 API 调用随机失败 [FastAPI]

python - 带有 pg8000 的 PostgreSQL - 将 SQL 的结果插入到另一个表

python-3.x - 需要使用 python 进行数据库连接的概述说明

python - 更改极坐标投影子图的大小

python - PyQt 的 "pyqtProperty"VS python 的标准 "property"

python - “%s”% myobject : overloading

python - 如何添加一列 timedelta 并将其与另一列关联?

java - 如何在 sql INSERT 期间自动生成 ID?