pyodbc rowcount只返回-1

时间:2017-11-28 20:30:52

标签: python python-3.x pyodbc

rowcount如何运作。我正在使用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 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

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

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

  

如果 [...] 接口无法确定最后一个操作的行数,则属性为-1

pyodbc Cursor.rowcount documentation符合以下要求:

  

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

     

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

pyodbc并非仅此一个,另一个易于链接的示例是Python标准库sqlite3模块;它是Cursor.rowcount documentation状态:

  

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

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

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

答案 2 :(得分:1)

如果您使用的是Microsoft sql server,并且想要获取在先前的select语句中返回的行数,则只需执行select @@rowcount

例如:

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