2015-10-14 2 views
0

У меня есть операция, когда родительская модель должна быть создана с некоторым количеством дочерних моделей. Если создание любого из этих экземпляров не выполняется, все это нужно отменить. Родительская модель и ее дети должны не существуют в базе данных при возникновении ошибки.Откат после неудачной транзакции

код у меня есть:

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

Чтобы отменить транзакцию, вы можете использовать 'transaction.rollback()'. – dirn

+0

@dirn 'rollback' не удаляет ранее сохраненные модели. Я обновил op с моей текущей настройкой. –

+0

Проблема в том, что вы вызываете 'commit' в сеансе. 'transaction' и' session' - это два разных сеанса. Вы пытаетесь их вложить? – dirn

ответ

2

Колба-SQLAlchemy поворачивает на AUTOCOMMIT по умолчанию. Чтобы отменить транзакцию, вам нужно отключить ее. Вместо

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

использования

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

Это позволит вам добавить несколько объектов db.session, прежде чем либо фиксации или отката.

С помощью этого изменения вы можете удалить ваши ссылки на transaction.

+0

Я использовал это с комбинацией вложенных блоков 'try except' и' session.begin (subtransactions = True) '. Спасибо за вашу помощь! –

Смежные вопросы