如果引发异常,如何使Flask-SQLAlchemy自动回滚会话?

时间:2015-10-22 15:05:41

标签: python flask transactions flask-sqlalchemy

我想设置一个使用Flask-SQLAlchemy构建的应用程序来回滚对数据库所做的所有更改,如果视图引发了一个异常,即在视图代码之外冒泡(即没有在内部捕获)。

即使某些对象在子事务中被刷新到数据库中,我也希望它能够自动或直接通过session.commit()刷新。

Django's transaction request wrapping类似的东西。

2 个答案:

答案 0 :(得分:18)

你可以这样做:

@app.teardown_request
def teardown_request(exception):
    if exception:
        db.session.rollback()
    db.session.remove()

查看teardown_request信息here。如果处于调试模式,则可能需要设置PRESERVE_CONTEXT_ON_EXCEPTION config变量。

答案 1 :(得分:1)

您可以将回滚包括在自定义错误处理程序中...

@app.errorhandler(500)
def internal_error(error):
    db.session.rollback()
    return render_template('500.html'), 500

请参阅“自定义错误页面”部分下的here