【问题标题】:SqlAlchemy AsyncSession transactionSqlAlchemy AsyncSession 事务
【发布时间】:2022-12-03 22:56:47
【问题描述】:

当使用异步会话作为上下文管理器时,如果出现异常,我会收到一条警告,我想摆脱它。 这是我使用会话的方式:

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()

我得到的警告是:

RuntimeWarning: coroutine 'Transaction.rollback' was never awaited

我确定我应该做什么,这里的转折应该有点棘手,因为我在网上冲浪寻找任何可能的解决方案,但都没有奏效

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    您看到的警告消息 RuntimeWarning: coroutine 'Transaction.rollback' was never awaited 表示您正在使用异步上下文管理器 (async with session.begin()),但如果出现异常,您不会等待事务回滚。

    在您的代码中,您使用异步上下文管理器来管理数据库事务。这意味着当上下文管理器正常退出时,事务将自动提交,但如果引发异常,它将回滚。但是,因为您没有等待事务的回滚,Transaction.rollback协程从未真正执行并显示警告消息。

    要解决此问题,您只需将 await 语句添加到 Transaction.rollback 协程即可。这是您如何执行此操作的示例:

    async with session.begin() as txn:
        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 the rollback of the transaction
        await txn.rollback()
    

    【讨论】:

      猜你喜欢
      • 2013-11-23
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 2012-08-16
      • 2012-07-20
      相关资源
      最近更新 更多