行计数是如何工作的。我正在使用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)
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]