【问题标题】:Using cursor.execute arguments in pymssql with IN sql statement在带有 IN sql 语句的 pymssql 中使用 cursor.execute 参数
【发布时间】:2015-11-29 19:25:44
【问题描述】:

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

【问题讨论】:

  • 从未使用过pymssql,但对于SQLite,这需要使用cursor.executemany()
  • 我试过了,它返回对应于我的元组最后一个元素的数据。
  • 因为我不是 100% 确定,所以我还不会发布作为答案。看起来你只是通过SELECT * FROM t1 where id in (1)。你用元组调用execute,但字符串只有一个格式化程序,我知道这是元组的方式,但也许 pymsql 对它的解释不同
  • @Alex 如果 cursor.executemany() 返回最后一个元素并且 cursor.execute() 返回第一个元素,这意味着它一次查询一个值。您可以尝试连接元组并将其作为字符串传递

标签: python sql pymssql


【解决方案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。

【讨论】:

  • 谢谢劳伦斯,我用执行器试了一下,它返回一个错误,告诉我','附近的语法不正确。完全错误:pymssql.ProgrammingError: (102, "Incorrect syntax near ','.DB-Lib error message 20018, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\n")
  • 语法是正确的,但是当我使用 executemany 但它只检索第一个元素时。
【解决方案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()

顺便说一句,这里不一定需要元组。列表可以正常工作。

【讨论】:

  • 谢谢,这行得通。我唯一担心的是,如果我有很多 id,但我现在还好。
猜你喜欢
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多