pyodbc rowcount 只返回 -1

新手上路,请多包涵

行数如何工作。我正在使用 pyodbc,它总是返回 -1。

  return_query = conn.query_db_param(query, q_params)
 print(return_query.rowcount)

 def query_db_param(self, query, params):
     self.cursor.execute(query,params)
     print(self.cursor.rowcount)

原文由 user3525290 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

rowcount 指上次操作影响的行数。所以,如果你执行 insert 并且只插入一行,那么它将返回 1。如果你更新 200 行,那么它将返回 200。另一方面,如果你 SELECT ,最后一个操作并不真正影响 _行_,它是一个结果集。在这种情况下, 0 在语法上是不正确的,因此接口返回 -1

它还将返回 -1 对于您执行设置变量或使用创建/更改命令等操作的操作。

原文由 cwallenpoole 发布,翻译遵循 CC BY-SA 3.0 许可协议

您正在连接的数据库无法为您的查询提供该号码。许多数据库引擎在您获取结果时生成行,并在您这样做时扫描它们的内部表和索引数据结构以查找下一个匹配结果。在您获取所有行之前,引擎无法知道最终计数。

当行数未知时, Python DB-API 2.0 规范 Cursor.rowcount 指出在这种情况下必须将数字设置为 -1

该属性是 -1 以防万一 […] 最后一次操作的行数无法由接口确定。

pyodbc Cursor.rowcount 文档 符合这个要求:

最后一条 SQL 语句修改的行数。

如果没有执行 SQL 或者行数未知,则为 -1。请注意,出于性能原因,数据库在 SQL 选择语句之后立即报告 -1 的情况并不少见。 (在第一批记录返回给应用程序之前,可能不知道确切的数量。)

pyodbc 并不孤单,另一个易于链接的示例是 Python 标准库 sqlite3 模块;它是 Cursor.rowcount 文档 说明:

根据 Python DB API 规范的要求,rowcount 属性“在游标上未执行 executeXX() 的情况下为 -1,或者接口无法确定最后一个操作的行数”。这包括 SELECT 语句,因为在获取所有行之前我们无法确定查询生成的行数。

请注意,对于数据库实现的子集,可以在获取 某些 行后更新行计数值。您必须检查您正在连接的特定数据库文档,以查看该实现是否可以执行此操作,或者行数是否必须保持为 -1。当然,你总是可以尝试。

您可以先执行 COUNT() 选择,或者,如果预计结果集不会太大,请使用 cursor.fetchall() 并在结果列表上使用 len() .

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题