5

カーソル行を順次処理するときに、次の組み込み関数がどのように機能するかを理解しようとしています。説明は Python 3.1 マニュアル (SQLite3 を使用) からのものです。

Cursor.fetchone()

クエリ結果セットの次の行をフェッチし、単一のシーケンスを返します。

Cursor.fetchmany()

クエリ結果の次の行セットを取得し、リストを返します。

Cursor.fetchall()

クエリ結果のすべての (残りの) 行を取得し、リストを返します。

したがって、cursor.fetchone() を使用して一度に 1 つの行を処理するループがあり、後のコードで最初の行に戻るか、fetchall() を使用してすべての行をフェッチする必要がある場合、どうすればよいですか? ?

この概念は私には少し奇妙です。特に、カーソルの最初または最後の行に移動する (上/下に移動する) か、n 番目の行 (行きます n)

どんな助けでも大歓迎です。

アラン

4

1 に答える 1

9

Python 3.1 の SQLite インターフェイスはPEP 249に基づいており、カーソルがクエリ結果のレコードへの順次アクセスをサポートする必要があることのみを指定しています。戻る方法はありません。以前に取得した行に戻る必要がある場合は、最初に取得したときにそれを保存する必要があります。たとえば、取得したデータのリストを作成します (または実際には を使用しますfetchall)。次に、リストを操作して、必要なだけ行間を行き来できます。

DB API の設計の背後にある考え方は、各行を一度だけ処理する必要があるコードの効率的な実行をサポートすることです。典型的なループは次のようになります。

for a,b,c in cursor.fetchone():
    # process it

このようにして、対応するループの繰り返しが終了すると、カーソルは各行のデータへの参照を破棄できます。すべてのデータを保持したい場合は、いつでもリストを作成できるため、実際には何も失われませんが、大規模なデータセットを扱うアプリケーションでは、一度に 1 行ずつ処理することができます。iterable の要素を 1 つずつ処理する必要があるときに、リストではなくジェネレーター式を使用する理由のようなものです。

于 2010-05-09T04:19:47.363 に答える