pyodbc rowcount仅返回-1

use*_*290 2 python pyodbc python-3.x

行计数如何工作。我正在使用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)
Run Code Online (Sandbox Code Playgroud)

cwa*_*ole 5

rowcount指受上一操作影响的行数。因此,如果执行an insert并且仅插入一行,则它将返回1。如果更新200行,则它将返回200。另一方面,如果您执行SELECT,最后一个操作并不会真正影响row,则为结果集。在这种情况下,0从语法上讲是不正确的,因此接口返回-1

它还会返回-1您执行诸如设置变量或使用create / alter命令之类的操作的操作。

  • len(cursor.fetchall())是离您最近的。无论如何,这就是MySQL在幕后所做的。 (3认同)
  • *另一方面,如果选择SELECT,则最后一个操作并不会真正影响行,而是结果集。在这种情况下,0在语法上是不正确的,因此接口将返回-1。*这是不正确的,抱歉。许多数据库实现会将行数设置为“所选行数”。如果无法预先确定该数字,则仅将其设置为-1;否则,将其设置为-1。例如,SQLite引擎在返回所有行之前,将无法告诉您选择了多少行。pyodbc文档[明确涵盖了这种情况](https://github.com/mkleehammer/pyodbc/wiki/Cursor)。 (2认同)

Mar*_*ers 5

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

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

该属性是-1[...]最后一次操作的行数无法由接口确定的情况下。

pyodbcCursor.rowcount文档符合此要求:

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

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

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

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

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

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