行计数如何工作。 我正在使用 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 行。另一方面,如果您SELECT
,则最后一个操作并不真正影响行,它是一个结果集。在这种情况下,0
语法不正确,因此接口将返回-1
。
它还将为执行设置变量或使用创建/更改命令等操作的操作返回-1
。
您正在连接到无法为查询提供该编号的数据库。许多数据库引擎会在您获取结果时生成行,并在您这样做时扫描其内部表和索引数据结构以查找下一个匹配结果。在您提取所有行之前,引擎无法知道最终计数。
当行计数未知时,Cursor.rowcount
的 Python DB-API 2.0 规范规定,在这种情况下,必须将数字设置为-1
:
该属性是
-1
以防[...]接口无法确定最后一个操作的行数。
pyodbcCursor.rowcount
文档符合以下要求:
最后一个 SQL 语句修改的行数。
如果未执行 SQL 或行数未知,则为 -1。请注意,出于性能原因,数据库在 SQL select 语句之后立即报告 -1 的情况并不少见。(在将第一条记录返回到应用程序之前,可能不知道确切的数字。
pyodbc 并不孤单,另一个易于链接的例子是 Python 标准库sqlite3
模块;它Cursor.rowcount
文档指出:
根据 Python DB API 规范的要求,rowcount 属性"在游标上未执行
executeXX()
或接口无法确定最后一个操作的行计数的情况下为 -1"。这包括SELECT
语句,因为在获取所有行之前,我们无法确定查询生成的行数。
请注意,对于数据库实现的子集,可以在获取某些行后更新行计数值。您必须检查要连接到的特定数据库文档,以查看该实现是否可以执行此操作,或者行计数是否必须保持在 -1。 当然,你总是可以尝试的。
可以先执行COUNT()
选择,或者,如果结果集预计不会太大,则使用cursor.fetchall()
并在结果列表中使用len()
。
如果您使用的是 Microsoft SQL Server,并且想要获取前面 select 语句中返回的行数,则可以执行select @@rowcount
。
例如:
cursor.execute("select @@rowcount")
rowcount = cursor.fetchall()[0][0]