2016-09-29 66 views
0

我想知道是否應該在失敗的提交後調用SQLAlchemy中的回滾?如果發生一些錯誤,我想繼續保存對象。我不在乎交易保存。我應該使用autocommit = False在Sqlalchemy中調用回滾嗎?

engine = create_engine("db", convert_unicode=True, echo=False) 
Session = scoped_session(sessionmaker(bind=engine, autocommit=False)) 

for row in data: 
    try: 
     Session.add(row) 
     Session.commit() 
    except: 
     # rollback ??? 

     # continue saving rest of the objects 
     continue 

Session.remove() 

回答

1

當您使用Sqlachemy沒有自動提交,你需要通過調用session.commit()session.rollback()保持手動Transactions狀態。有onetwo有用的文件鏈接。

但在您的示例中,您爲每個row提供一筆交易。當其中一個事務失敗時,當前行將不會保存,您的代碼將爲下一行生成新的事務。

在這種情況下,使用autocommit=False對性能沒有任何好處。 如果您的數據集很大,您可以嘗試將其分成不同的塊,並且每個塊使用一個事務。或者使用autocommit選項,不用擔心事務狀態。