55

結果セットを反復処理するには、いくつかの方法があります。それぞれのトレードオフは何ですか?

4

3 に答える 3

54

標準的な方法は、組み込みのカーソル反復子を使用することです。

curs.execute('select * from people')
for row in curs:
    print row

fetchall()一度にすべての行を取得するために使用できます。

for row in curs.fetchall():
    print row

これを使用して、返された値を含む Python リストを作成すると便利です。

curs.execute('select first_name from people')
names = [row[0] for row in curs.fetchall()]

これは、結果セットが小さい場合に役立ちますが、結果セットが大きい場合は悪影響を与える可能性があります。

  • 結果セット全体がクライアント プロセスに返されるまで待つ必要があります。

  • 構築されたリストを保持するために、クライアントで大量のメモリを消費する可能性があります。

  • とにかくすぐに破棄しようとしているリストを Python が構築および分解するには、しばらく時間がかかる場合があります。


結果セットに単一の行が返されることがわかっている場合は、呼び出しfetchone()て単一の行を取得できます。

curs.execute('select max(x) from t')
maxValue = curs.fetchone()[0]

最後に、一度に 1 行ずつフェッチする結果セットをループできます。一般に、反復子を使用するよりもこれを行うことに特別な利点はありません。

row = curs.fetchone()
while row:
    print row
    row = curs.fetchone()
于 2008-08-03T01:17:36.393 に答える
27

私の好みの方法はカーソル イテレータですが、最初にカーソルの arraysize プロパティを設定します。

curs.execute('select * from people')
curs.arraysize = 256
for row in curs:
    print row

この例では、cx_Oracle は一度に 256 行ずつ Oracle から行をフェッチし、実行する必要があるネットワーク ラウンド トリップの数を減らします。

于 2008-09-24T02:51:00.173 に答える
6

それを行う方法もありpsyco-pgます...私が収集したものから、キールックアップをクエリによって返されたメモリブロックにマップするために、辞書のような行プロキシを作成するようです。その場合、回答全体をフェッチし、行に対して同様のプロキシ ファクトリを操作することは、有用なアイデアのように思えます。考えてみれば、Python というよりは Lua に近い気がします。

また、これはOracleだけでなく、すべての PEP-249 DBAPI2.0 インターフェイスに適用できるはずです。

于 2008-08-24T17:28:26.200 に答える