资料
sqlalchemy 事务 - 简书
- 在 SQLAlchemy 中,事务是通过会话来管理的。当你开始一个事务(例如使用
async with db.begin()
),它会开启一个新的事务,并在事务块结束时自动提交或回滚。- 如果在同一个会话中,事务还未结束,就再次尝试开始另一个事务,就会抛出
A transaction is already begun on this Session
这个错误。
解决
报错的中文解释是:此会话上已经有一个开始了的事务.
嘛意思呢? 你在同一个数据库会话(Session)中尝试开始一个新的事务,而实际上这个会话已经有一个正在进行中的事务了。
也就是说:你执行的另外一个数据库操作没有完成.
最后通过 :session.in_transaction()方法来找哪里没有关闭
然后找到了
result = await db.execute(select(XXXX).filter(...))_result = result.scalars().all()
此处开启了一个事务 -_-! (查询也开事务啊?,其实是 .excute()会开启事务)
在需要的地方执行 .commit() 或 .rollback() 即可