提问者:小点点

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)

共3个答案

匿名用户

rowcount指受上次操作影响的行数。因此,如果执行insert并仅插入一行,则它将返回1。如果更新200行,那么它将返回200行。另一方面,如果选择,最后一个操作实际上不会影响行,它是一个结果集。在这种情况下,0在语法上不正确,因此接口返回-1

对于执行设置变量或使用create/alter命令等操作的操作,它还将返回-1

匿名用户

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

当行数未知时,Python DB-API2.0规范将针对游标。rowcount说明在这种情况下,数字必须设置为-1

在第[…]种情况下,属性为-1接口无法确定最后一个操作的行数。

pyodbc光标。行数文档符合此要求:

最后SQL语句修改的行数。

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

Pyodbc并不孤单,另一个易于链接的例子是Python标准库sqlite3模块;它的Cursor.rowcount留档状态:

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

请注意,对于数据库实现的子集,可以在获取某些行后更新行计数值。您必须检查要连接到的特定数据库留档,看看实现是否可以做到这一点,或者行计数是否必须保持为-1。当然,你可以随时进行实验。

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

匿名用户

如果您使用的是microsoft sql server,并且您想要获取在之前的Select语句中返回的行数,那么您可以只执行选择@@rowcount

例如。:

cursor.execute("select @@rowcount")
rowcount = cursor.fetchall()[0][0]