使用带有IN sql语句的pymssql中的cursor.execute参数

时间:2015-09-03 20:01:09

标签: python sql pymssql

通过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,我无法弄清楚原因。 有没有人遇到同样的行为?

2 个答案:

答案 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。