我在脚本中有一个SQLAlchemy会话。该脚本运行了很长时间,它只从数据库中提取数据,从不更新或插入。
我遇到了很多错误,比如
sqlalchemy.exc.DBAPIError: (TransactionRollbackError) terminating connection due to conflict with recovery
DETAIL: User was holding a relation lock for too long.
我理解它的方式,SQLAlchemy使用发出的第一个select创建一个事务,然后重用它。由于我的脚本可能会运行大约一个小时,因此很可能在该事务的生命周期内出现冲突。
为了摆脱这个错误,我可以在不推荐的模式下使用autocommit(不做更多的事情),但文档明确表示不鼓励这样做。
处理错误的正确方法是什么?我可以在没有交易的情况下使用ORM查询吗?
答案 0 :(得分:0)
我(几乎)每次选择后都结束了会话,比如
session.query(Foo).all()
session.close()
因为我不使用自动提交,所以会自动打开一个新事务。