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)
答案 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]