我有一个操作,需要使用一定数量的子模型创建父模型。如果任何这些实例的创建失败,则需要取消整个事件。如果出现错误,父模型及其子模型应该不存在于数据库中。
我的代码:
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
答案 0 :(得分:2)
Flask-SQLAlchemy默认启用自动提交。要回滚事务,您需要将其关闭。而不是
db = SQLAlchemy(app) # or whatever variation you use
使用
db = SQLAlchemy(app, session_options={'autocommit': False})
这将允许您在提交或回滚之前向db.session
添加多个对象。
通过此更改,您可以删除对transaction
。