cursor.rowcount在python3k中的sqlite3中始终为-1

Hip*_*i0n 24 python database sqlite

我试图在我的Python3k程序中得到rowcount一个sqlite3 cursor,但我很困惑,因为rowcount它始终是-1,尽管Python3文档说(实际上它是矛盾的,它应该是None).即使在取出所有行之后,rowcount仍然留在-1.这是一个sqlite3错误吗?我已经检查过表中是否有行.

我可以绕过这个检查,如果一个fetchone()返回不同的东西None,但我认为这个问题很好讨论.

谢谢.

nos*_*klo 20

文档:

根据Python DB API Spec的要求,如果没有对游标执行executeXX()或者最后一个操作的rowcount不能被接口确定,则rowcount属性"为-1".

这包括SELECT语句,因为在获取所有行之前,我们无法确定查询生成的行数.

这意味着所有 SELECT陈述都没有rowcount.记录您正在观察的行为.

编辑:文档没有说明你做任何事后rowcount 都会更新,fetchall()所以假设这是错误的.


小智 16

cursor = newdb.execute('select * from mydb;')
print len(cursor.fetchall())
Run Code Online (Sandbox Code Playgroud)

fetchall()将返回select返回的行列表.该列表的Len将为您提供行数.

  • 最主要的警告是-如果发生更改,该调用将返回过多的行,则可能会遇到内存问题。(这就是为什么execute返回游标[Python迭代器]而不返回显式列表或数组的原因)。(尽管在我的特定情况下,这不是问题。) (2认同)

Ale*_*lli 8

我建议不要"检查fetchone()是否返回与None不同的东西",而是建议:

cursor.execute('SELECT * FROM foobar')
for row in cursor:
   ...
Run Code Online (Sandbox Code Playgroud)

这只是sqlite-only(在其他DB API实现中不支持),但非常方便的sqlite特定Python代码(并且完整记录,请参阅http://docs.python.org/library/sqlite3.html).


oxi*_*rks 7

可以这样计算行数:

 print cur.execute("SELECT COUNT(*) FROM table_name").fetchone()[0]
Run Code Online (Sandbox Code Playgroud)