cx_Oracle:結果セットを反復処理するにはどうすればよいですか?
質問
結果セットを反復するにはいくつかの方法があります。それぞれのトレードオフは何ですか?
解決
標準的な方法は、組み込みのカーソル反復子を使用することです。
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()
他のヒント
私の推奨する方法はカーソル反復子ですが、最初にカーソルの arraysize プロパティを設定します。
curs.execute('select * from people')
curs.arraysize = 256
for row in curs:
print row
この例では、cx_Oracle は Oracle から一度に 256 行をフェッチし、実行する必要があるネットワーク ラウンド トリップの数を減らします。
そういう方法もあります psyco-pg
やるようです...私が収集した情報によると、辞書のような行プロキシを作成して、キー検索をクエリによって返されたメモリ ブロックにマッピングしているようです。その場合、答え全体を取得し、行に対して同様のプロキシ ファクトリを使用するのが便利なアイデアのように思えます。でも考えてみると、Python よりも Lua に近い気がします。
また、これはすべてに当てはまるはずです PEP-249 DBAPI2.0 Oracle だけでなく、インターフェースについても同様です。それとも、単に Oracle だけを指しますか? 最速の を使用して オラクル?