我正在使用Django 1.8并使用connection.cursor
进行一些原始SQL查询。
我的问题是如何安全地向游标提供多个参数。这是我的代码:
cursor = connection.cursor()
query = "SELECT cost, id, date, org_id FROM mytable "
query += " WHERE ("
for i, c in enumerate(codes):
query += "id=%s "
if (i != len(codes)-1):
query += ' OR '
query += " AND "
for i, c in enumerate(orgs):
query += "org_id=%s "
if (i != len(orgs)-1):
query += ' OR '
cursor.execute(query, tuple(codes), tuple(orgs))
但是这给了我:
TypeError: execute() takes at most 3 arguments (4 given)
我正在尝试关注the PEP documentation on execute
,它表示可以使用executemany
代替,但这似乎也无济于事:
cursor.executemany(query, [tuple(codes), tuple(orgs)])
如果没有示例,我就无法遵循PEP文档。有人可以帮忙吗?
答案 0 :(得分:1)
你的问题是你传递的更多参数execute
比它接受的更多。您需要的是将查询的参数组合到一个元组中。一种方法是使用itertools.chain
将两个列表的元素链接到一个可用于创建单个元组的iterable中:
import itertools
cursor.execute(query, tuple(itertools.chain(codes, orgs)))