У меня есть операция, когда родительская модель должна быть создана с некоторым количеством дочерних моделей. Если создание любого из этих экземпляров не выполняется, все это нужно отменить. Родительская модель и ее дети должны не существуют в базе данных при возникновении ошибки.Откат после неудачной транзакции
код у меня есть:
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
Чтобы отменить транзакцию, вы можете использовать 'transaction.rollback()'. – dirn
@dirn 'rollback' не удаляет ранее сохраненные модели. Я обновил op с моей текущей настройкой. –
Проблема в том, что вы вызываете 'commit' в сеансе. 'transaction' и' session' - это два разных сеанса. Вы пытаетесь их вложить? – dirn