問題
SELECT対象のレコード件数が多い場合、fetchall()でデータ取得するとMemoryErrorが発生する
調査したこと
yiedl_perオプションで分割してデータ取得できるようなので試してみた
SQLAlchemy 1.4 Documentation streaming-with-a-fixed-buffer-via-yield-per
with engine.connect() as conn:
result = conn.execution_options(yield_per=100).execute(text("select * from table"))
for partition in result.partitions():
# partition is an iterable that will be at most 100 items
for row in partition:
print(f"{row}")
しかし'LegacyCursorResult' object does not support the context manager protocol
のエラーが発生した
使用しているSQLAlchemyのversionは1.4.4なので見るDocummentは間違っていないはずなんだけど…
解決策
yield_per(100)
の指定場所を変更し、結局下記の書き方で意図していた動作になった
with engine.connect() as conn:
result = conn.execute(text("select * from table"))
for partition in result.yield_per(100).partitions():
# process for each 100 items
functionA(partition)