Psycopg2には、サーバー側カーソルを操作するための優れたインターフェイスがあります。これは使用可能なテンプレートです:
with psycopg2.connect(database_connection_string) as conn:
with conn.cursor(name='name_of_cursor') as cursor:
cursor.itersize = 20000
query = "SELECT * FROM ..."
cursor.execute(query)
for row in cursor:
# process row
上記のコードは接続を作成し、クエリ結果をサーバー側カーソルに自動的に配置します。値itersize
クライアントがサーバー側カーソルから一度にプルダウンする行数を設定します。使用する値は、ネットワーク呼び出しの数とクライアントのメモリ使用量のバランスを取る必要があります。たとえば、結果の数が300万の場合、itersize
値が2000(デフォルト値)の場合、1500のネットワーク呼び出しが発生します。 2000行で消費されるメモリが少ない場合は、その数を増やします。
カーソルの行にfor row in cursor
もちろん、一度に1行ずつ操作しますが、Psycopg2はitersize
をプリフェッチします 一度に1行ずつ。
fetchmany
を使用する場合 何らかの理由で、次のようなことができます:
while True:
rows = cursor.fetchmany(100)
if len(rows) > 0:
for row in rows:
# process row
else:
break
このfetchmany
の使用法 プリフェッチされたバッチが使い果たされるまで、サーバーへのネットワーク呼び出しをトリガーしてさらに行を追加することはありません。 (これは、上記のコードについて何も提供しない複雑な例ですが、fetchmany
の使用方法を示しています 必要があれば。)