通过pymssql使用操作符IN使用简单的sql语句我遇到了麻烦。
以下是一个示例:
import pymssql
conn = pymssql.connect(server='myserver', database='mydb')
cursor = conn.cursor()
req = "SELECT * FROM t1 where id in (%s)"
cursor.execute(req, tuple(range(1,10)))
res = cursor.fetchall()
令人惊讶的是,只返回了第一个ID,我无法弄清楚原因。 有没有人遇到同样的行为?
答案 0 :(得分:2)
您尝试将九个ID值传递给查询,而您只有一个占位符。您可以通过这样做获得九个占位符:
ids = range(1,10)
placeholders = ','.join('%s' for i in ids)
req = "SELECT * FROM t1 where id in ({})".format(placeholders)
cursor.execute(req, ids)
res = cursor.fetchall()
顺便说一句,你不一定需要一个元组。列表可以正常工作。
答案 1 :(得分:1)
看起来你只是传递了SELECT * FROM t1 where id in (1)
。你用元组调用execute
但字符串只有一个格式化程序。要传递所有值,请像这样调用execute
:
cursor.execute(req, (tuple(range(1,10)),))
这会将元组作为第一个参数传递给要格式化的字符串。
编辑:关于executeone/many()
事情,如果您拨打executemany
并返回上一个而不是第一个ID,则execute
似乎会运行查询10次,因为它可以格式化具有10个值的字符串。最后一次运行将返回最后一个id。