使用 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/