如何为单个Session修改python-oracledb Cursor的arraysize
为单个SQLAlchemy AsyncSession修改Oracle Cursor的arraysize
技术栈
- oracledb==2.5.1
- sqlalchemy==2.0.25
- fastapi==0.105.0
问题需求
在create_async_engine中设置arraysize会统一作用于连接池内的所有连接,但在大数据查询场景下,需要为单个AsyncSession单独修改Cursor的arraysize,不影响其他Session的配置。
解决方案
要实现这个需求,需获取Session对应的Oracle原生连接,直接修改其arraysize属性。以下是具体代码修改示例:
修改FastAPI接口代码
@dummy_router.get("/dummy_db_gen") async def dummy_db_gen( *, chunk_size: int = 1000, session: AsyncSession = Depends(suag_connection.get_session) ) -> int: # 定义引擎默认的arraysize(与create_async_engine中设置的一致) DEFAULT_ARRAYSIZE = 5000 async with session.connection() as conn: # 获取oracledb原生连接对象 raw_conn = await conn.get_raw_connection() # 保存原arraysize,用于后续恢复 original_arraysize = raw_conn.arraysize # 设置当前Session需要的arraysize raw_conn.arraysize = chunk_size try: # 执行大数据查询 res = await session.execute( text("select id_art, name, id_group from suag.v_article where rownum <= 100000") ) iteration = 1 # 按指定chunk_size分批获取结果 for chunk in res.yield_per(chunk_size): iteration += 1 return iteration finally: # 恢复原arraysize,避免影响后续复用该连接的Session raw_conn.arraysize = original_arraysize
关键说明
- 获取原生连接:通过
session.connection()获取当前Session绑定的数据库连接,再调用get_raw_connection()拿到oracledb的原生连接实例,直接修改其arraysize属性。 - 恢复默认值:由于连接池会复用连接,修改后的
arraysize会保留在连接上,因此操作完成后需恢复为默认值,避免影响其他使用该连接的Session。 - 生效范围:该修改仅对当前Session使用的连接生效,后续使用同一连接的Session会继承修改后的配置(除非手动恢复)。
内容的提问来源于stack exchange,提问作者Kamo Petrosyan
相关产品推荐
相关产品推荐

