使用SqlAlchemy AsyncSession上下文管理器时如何消除回滚协程未等待警告?
解决SQLAlchemy AsyncSession事务异常时的RuntimeWarning问题
当使用AsyncSession.begin()作为上下文管理器抛出异常时,出现RuntimeWarning: coroutine 'Transaction.rollback' was never awaited警告,核心原因是事务的回滚协程未被正确执行。以下是两种可行的解决方式:
方案一:嵌套会话与事务的上下文管理器
确保会话本身被async with管理,再开启事务,异常发生时回滚操作会被自动处理:
async with session: async with session.begin(): retailer: model.Retailer = (await session.scalars(select(model.Retailer).filter(model.Retailer.name=="default"))).first() await session.execute(insert(model.Contact).values(mock_contact(retailer.uuid))) raise RuntimeError()
方案二:显式手动回滚事务
捕获异常后显式调用await transaction.rollback(),确保回滚协程被执行:
async with session.begin() as transaction: try: retailer: model.Retailer = (await session.scalars(select(model.Retailer).filter(model.Retailer.name=="default"))).first() await session.execute(insert(model.Contact).values(mock_contact(retailer.uuid))) raise RuntimeError() except Exception: await transaction.rollback() raise
另外,如果你的SQLAlchemy版本低于1.4.30,建议升级到最新稳定版——旧版本存在异步事务上下文管理器的已知bug,升级后也能消除该警告。
内容的提问来源于stack exchange,提问作者Hossein Gholami
相关产品推荐
相关产品推荐

