事务失败后回滚

时间:2015-10-14 14:18:59

标签: flask transactions sqlalchemy

我有一个操作,需要使用一定数量的子模型创建父模型。如果任何这些实例的创建失败,则需要取消整个事件。如果出现错误,父模型及其子模型应该存在于数据库中。

我的代码:

transaction = db.engine.connect().begin()

try:
    parent = ParentModel()
    db.session.add(parent)
    db.session.commit()

    child = ChildModel(parent_id=parent.id)
    db.session.add(child)
    db.session.commit()

    # An error occurs.  We need to rollback the saved parent model.
    raise HTTPException() # from werkzeug
except:
    transaction.rollback()

transaction.commit()

我的测试:

def test(self):
    # call the above operation
    ParentModel.query.filter_by(id=1).first() # returns the parent model

1 个答案:

答案 0 :(得分:2)

Flask-SQLAlchemy默认启用自动提交。要回滚事务,您需要将其关闭。而不是

db = SQLAlchemy(app)  # or whatever variation you use

使用

db = SQLAlchemy(app, session_options={'autocommit': False})

这将允许您在提交或回滚之前向db.session添加多个对象。

通过此更改,您可以删除对transaction

的引用