SQLAlchemy yield_per でデータ取得ごとに処理をする

問題

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)