web-dev-qa-db-ja.com

cursor.rowcountは、python3kのsqlite3では常に-1です。

Python3kプログラムで_sqlite3_ rowcountcursorを取得しようとしていますが、rowcountは常に_-1_であるため、困惑しています。 、Python3のドキュメントに書かれていることにもかかわらず(実際には矛盾していますが、Noneである必要があります)。すべての行をフェッチした後でも、rowcountは_-1_に留まります。 _sqlite3_のバグですか?テーブルに行があるかどうかはすでに確認しました。

fetchone()Noneとは異なるものを返す場合は、このチェックを回避できますが、この問題について説明するとよいと思いました。

ありがとう。

23
Hiperi0n

ドキュメント から:

Python DB API仕様で要求されているように、カーソルでexecuteXX()が実行されていない場合、または最後の操作の行数がインターフェイスで決定できない場合、行数属性は-1です。 」。

すべての行がフェッチされるまでクエリが生成した行数を特定できないため、これにはSELECTステートメントが含まれます。

つまり、allSELECTステートメントにはrowcount。観察している動作は文書化されています。

編集:ドキュメントにはrowcountとは書かれていません-)fetchall()を実行した後に更新されるため、それを想定するのは誤りです。

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

Fetchall()は、selectから返された行のリストを返します。そのリストのレンはあなたに行数を与えるでしょう。

15
user3320621

「fetchone()がNone以外のものを返すかどうかを確認する」代わりに、次のことをお勧めします。

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

これはsqliteのみ(他のDB API実装ではサポートされていません)ですが、sqlite固有のPythonコード(and完全に文書化されています。 http://docs.python.org/library/sqlite3.html )を参照してください。

8
Alex Martelli

この方法で行を数える方がよい場合があります。

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