如何在Async SQLAlchemy中访问关联关系并解决MissingGreenlet报错
报错原因
MissingGreenlet错误的核心原因是Async SQLAlchemy不支持同步懒加载逻辑:你查询A实例时没有提前加载关联的bs属性,直接访问a1.bs会触发默认的同步懒加载查询,但异步运行环境不允许直接执行同步IO操作,因此抛出异常。
解决方案
方案1:查询时预加载关联属性(最推荐)
在构造查询语句时用selectinload指定要提前加载的关联字段,一次性把A和对应的B数据都查出来,避免后续额外IO,也能避免N+1查询问题。
只需要修改查询部分的代码即可:
async with async_session() as session: # 加上options(selectinload(A.bs))预加载关联的bs属性 result = await session.execute(select(A).options(selectinload(A.bs)).order_by(A.id)) a1 = result.scalars().first() print(a1.name, a1.data) # 现在可以直接访问,不会报错 print(a1.bs)
方案2:异步懒加载关联属性
如果你确实不需要每次都提前加载关联数据,可以通过awaitable_attrs异步触发懒加载,注意该操作必须在当前session未关闭的状态下执行,session释放后无法使用该方法。
对应修改代码如下:
async with async_session() as session: result = await session.execute(select(A).order_by(A.id)) a1 = result.scalars().first() print(a1.name, a1.data) # 异步加载关联属性 bs = await a1.awaitable_attrs.bs print(bs)
内容的提问来源于stack exchange,提问作者muon
相关产品推荐
相关产品推荐

