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

Using cursor.execute arguments in pymssql with IN sql statement

我在通过 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,我不明白为什么。 有没有人遇到同样的行为?

看来你只是通过了SELECT * FROM t1 where id in (1)。你用元组调用 execute 但字符串只有一个格式化程序。要传递所有值,请像这样调用 execute

cursor.execute(req,  (tuple(range(1,10)),))

这会将元组作为第一个参数传递给要格式化的字符串。

编辑:关于 executeone/many() 的事情,如果你调用 executemany 并且它 return 是最后一个而不是第一个 id,似乎 execute 将 运行 查询 10 次,因为它可以用 10 个值格式化字符串。最后一个 运行 将 return 最后一个 ID。

您正试图将九个 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()

顺便说一句,您在这里不一定需要元组。一个列表就可以了。