行数是如何工作的。我使用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)发布于 2017-11-29 04:47:56
rowcount是指受最后一次操作影响的行数。因此,如果您执行insert并只插入一行,则它将返回1。如果您更新200行,则它将返回200。另一方面,如果使用SELECT,最后一个操作实际上并不影响行,它是一个结果集。在这种情况下,0在语法上是不正确的,因此接口返回-1。
它还将为您执行设置变量或使用create/alter命令等操作的操作返回-1。
发布于 2019-02-11 21:58:58
您正在连接的数据库无法为您的查询提供该数字。许多数据库引擎在您获取结果时生成行,并在您执行此操作时扫描其内部表和索引数据结构以查找下一个匹配结果。在获取所有行之前,引擎无法知道最终的计数。
当行数未知时,Python DB-API 2.0 specification for Cursor.rowcount声明在这种情况下必须将行数设置为-1:
属性为
-1,以防...接口无法确定最后一个操作的行数。
pyodbc Cursor.rowcount documentation符合以下要求:
最后一条SQL语句修改的行数。
如果没有执行SQL或行数未知,则为-1。注意,出于性能原因,数据库在SQL select语句后立即报告的情况并不少见。(在将第一条记录返回给应用程序之前,可能不知道确切的数字。)
Cursor.rowcount documentation并不是唯一的例子,另一个易于链接的例子是Python标准库pyodbc模块;它的pyodbc声明:
根据Python DB API规范的要求,
属性“如果没有在游标上执行
executeXX()或者接口不能确定最后一个操作的行数,则为-1”。这包括SELECT语句,因为在提取所有行之前,我们无法确定查询生成的行数。
请注意,对于数据库实现的子集,可以在获取某些行之后更新行计数值。您必须检查您要连接到的特定数据库文档,看看这些实现是否可以做到这一点,或者行数是否必须保持为-1。当然,你可以随时进行实验。
您可以首先执行COUNT() select,或者,如果预期结果集不会太大,则使用cursor.fetchall()并对结果列表使用len()。
发布于 2020-02-14 15:36:39
如果您使用的是microsoft sql server,并且希望获得前一条select语句中返回的行数,则只需执行select @@rowcount即可。
例如:
cursor.execute("select @@rowcount")
rowcount = cursor.fetchall()[0][0]https://stackoverflow.com/questions/47540412
复制相似问题