Python3kプログラムで_sqlite3
_ rowcount
のcursor
を取得しようとしていますが、rowcount
は常に_-1
_であるため、困惑しています。 、Python3のドキュメントに書かれていることにもかかわらず(実際には矛盾していますが、None
である必要があります)。すべての行をフェッチした後でも、rowcount
は_-1
_に留まります。 _sqlite3
_のバグですか?テーブルに行があるかどうかはすでに確認しました。
fetchone()
がNone
とは異なるものを返す場合は、このチェックを回避できますが、この問題について説明するとよいと思いました。
ありがとう。
ドキュメント から:
Python DB API仕様で要求されているように、カーソルでexecuteXX()が実行されていない場合、または最後の操作の行数がインターフェイスで決定できない場合、行数属性は-1です。 」。
すべての行がフェッチされるまでクエリが生成した行数を特定できないため、これには
SELECT
ステートメントが含まれます。
つまり、allSELECT
ステートメントにはrowcount
。観察している動作は文書化されています。
編集:ドキュメントにはrowcount
がとは書かれていません-)fetchall()
を実行した後に更新されるため、それを想定するのは誤りです。
cursor = newdb.execute('select * from mydb;')
print len(cursor.fetchall())
Fetchall()は、selectから返された行のリストを返します。そのリストのレンはあなたに行数を与えるでしょう。
「fetchone()がNone以外のものを返すかどうかを確認する」代わりに、次のことをお勧めします。
cursor.execute('SELECT * FROM foobar')
for row in cursor:
...
これはsqlite
のみ(他のDB API実装ではサポートされていません)ですが、sqlite
固有のPythonコード(and完全に文書化されています。 http://docs.python.org/library/sqlite3.html )を参照してください。
この方法で行を数える方がよい場合があります。
print cur.execute("SELECT COUNT(*) FROM table_name").fetchone()[0]