2011-02-06 11 views
2

によって返される行の数は、だから私はthe documentationを読んで、それは言う私に言う:、なぜ(cursor.rowcountすることはできませんが)select文

をCursor.rowcount¶

sqlite3のモジュールのカーソルクラスは、この 属性を実装していますが、「行 影響を受けた」/」選択された行」の決意のためのデータベースエンジンの独自の サポートは風変わりです。

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

どのようにSELECTを実行した直後に、これを使用して返される行の数を判断することはできません。確かに実行されたクエリは、すべての行を取得しましたか?

答えて

9

SQLiteはクエリを最初に処理するときにすべての行を「フェッチ」しません。これは、準備されたクエリがステップされるたびに単一の行を返します。 funcは、行の数を得ることができSQLite3のよくある質問here

Q)から

A)結果セット内の行数を取得する機能はありません。 SQLiteはあらかじめ数値を知っていませんが、テーブルを反復しながら行ごとに返します。アプリケーションは、成功したsqlite3_step()が成功するたびに必要に応じて行カウンタをインクリメントすることができます。

一部のラッパーは、メモリー内の表の結果セット内のすべての行を収集できるため、行数を戻すことができます。

あなたは常に一定のSELECT文はいくつかのパフォーマンスを犠牲に返す行数を取得することができます:あなたが/削除行を挿入から他の接続を防止するために、トランザクションでこれをラップする必要があり

BEGIN IMMEDIATE TRANSACTION; 
SELECT COUNT(*) FROM x WHERE y; 
SELECT a,b,c FROM x WHERE y; 
ROLLBACK TRANSACTION; 

を2つのSELECTステートメントの間。

+0

すばらしい答えをいただきありがとうございます。これにより、何が起こっているのかがはっきりと分かり、私に何をすべきか正確に教えてくれました。 – Andrew

関連する問題