cursor.rowcount always -1 in sqlite3 in python3k

匿名 (未验证) 提交于 2019-12-03 01:39:01

问题:

I am trying to get the rowcount of a sqlite3 cursor in my Python3k program, but I am puzzled, as the rowcount is always -1, despite what Python3 docs say (actually it is contradictory, it should be None). Even after fetching all the rows, rowcount stays at -1. Is it a sqlite3 bug? I have already checked if there are rows in the table.

I can get around this checking if a fetchone() returns something different than None, but I thought this issue would be nice to discuss.

Thanks.

回答1:

From the documentation:

As required by the Python DB API Spec, the rowcount attribute “is -1 in case no executeXX() has been performed on the cursor or the rowcount of the last operation is not determinable by the interface”.

This includes SELECT statements because we cannot determine the number of rows a query produced until all rows were fetched.

That means all SELECT statements won't have a rowcount. The behaviour you're observing is documented.

EDIT: Documentation doesn't say anywhere that rowcount will be updated after you do a fetchall() so it is just wrong to assume that.



回答2:

cursor = newdb.execute('select * from mydb;') print len(cursor.fetchall()) 

The fetchall() will return a list of the rows returned from the select. Len of that list will give you the rowcount.



回答3:

Instead of "checking if a fetchone() returns something different than None", I suggest:

cursor.execute('SELECT * FROM foobar') for row in cursor:    ... 

this is sqlite-only (not supported in other DB API implementations) but very handy for sqlite-specific Python code (and fully documented, see http://docs.python.org/library/sqlite3.html).



回答4:

May better count the rows this way:

 print cur.execute("SELECT COUNT(*) FROM table_name").fetchone()[0] 


回答5:

Using PYCharm, in debug mode, if you put your cursor on your cursor variable, a small + will appear, when you click on it, you see different properties of your object.

In my cursor of 1 element, I see:

rowcount={int} arraysize={int}1 

So, in your code, just use:

print(cursor.arraysize) 1 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!