2015-10-14 197 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'不會刪除以前保存的模型。我已經使用當前的設置更新了操作。 –

+0

問題是你在會話中調用'commit'。 「交易」和「會話」是兩個不同的會話。你在試圖築巢它們嗎? – dirn

回答

2

燒瓶SQLAlchemy的默認打開自動提交。爲了回滾事務,您需要關閉它。取而代之的

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

使用

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

這將讓您無論是提交或回滾之前幾個對象添加到db.session

通過此更改,您可以刪除對transaction的引用。

+0

我用嵌套'嘗試除了''塊和'session.begin(subtransactions = True)'這個組合。感謝你的幫助! –