pyodbc行数只返回-1

问题描述 投票:2回答:2

如何行数的工作。我使用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)
python python-3.x pyodbc
2个回答
5
投票

rowcount指的是受上一操作的行数。所以,如果你做一个insert并插入只有一行,那么它将返回1.如果您更新200行,那么它将返回200。另一方面,如果你SELECT,最后的操作并没有真正影响行它是一个结果集。在这种情况下,0将语法不正确,所以界面返回-1代替。

它也将返回-1的,你做的事情,比如集合变量的操作或使用创建/修改命令。


1
投票

要连接到不能给你号码查询数据库。如你取结果,扫描他们的内部表和索引数据结构为下一个匹配的结果,你有那么多的数据库引擎产生行。该引擎可以不知道最终计数,直到获取所有行。

当行数不知道,在Python DB-API 2.0 specification for Cursor.rowcount状态的数量必须被设置在这种情况下,以-1

该属性是-1万一[...]的最后一个操作的行数,则不能由接口确定。

该pyodbc Cursor.rowcount documentation符合这个要求:

由过去的SQL语句修改的行数。

这是-1,如果没有SQL已执行,或者如果行数是未知的。请注意,这是不寻常的数据库报告-1性能原因SQL SELECT语句之后。 (第一记录返回到应用程序之前的精确数目可能不是已知的。)

pyodbc不单单是这个,另一个易于链接到例如是Python标准库sqlite3模块;这是Cursor.rowcount documentation状态:

根据需要由Python DB API规格,行数属性“是-1的情况下,没有executeXX()已上的光标进行或最后一个操作的行数不是由接口确定”。这包括SELECT声明,因为我们不能确定查询产生直到所有行均取的行数。

请注意,对于数据库实现的子集,该行计数值可以获取一些行后更新。你必须检查特定数据库的文档要连接到,看看是否能实现可以做到这一点,或者如果行数必须保持在-1。你总是可以尝试,当然。

你可以执行COUNT()第一选择,或者,如果结果集预计不会太大,使用cursor.fetchall()和结果列表上使用len()

© www.soinside.com 2019 - 2024. All rights reserved.