2013-02-02 25 views
8

這是正確的嗎?我知道第一個會工作,但我懷疑這對DB來說可能比可能需要更多的工作。第二項工作是否會同樣如此,但對於數據庫而言工作量較少?我正在使用MySQL FWIW。什麼時候應該使用for循環提交SQLAlchemy?

for item in items: 
    db.session.add(item) 
    db.session.commit() 

for item in items: 
    db.session.add(item) 
db.session.commit() 
+1

您共執行多少次操作?他們是否資源密集?除非有任何理由,否則你不會在每次之後提交,我不明白你爲什麼不想總是使用#1。 – woemler

回答

4

我認爲你的第二個解決方案是更好,但它取決於你如何配置你的會話。具體來說就是自動刷新和自動提交設置。你也應該使用一個對交易有很好支持的引擎,比如innodb。

假設你有autocommit和autoflush都關閉,那麼你會沖刷你的插入到服務器,提交事先的事務,然後創建另一個事務,每次迭代都會在SQLAlchemy和MySQL中創建大量不必要的工作。

我會推薦使用add_all,如果你有一個簡單的項目列表添加如你的例子,否則,如果你確實需要循環,那麼肯定在循環外應用提交。

http://docs.sqlalchemy.org/en/latest/orm/session.html#sqlalchemy.orm.session.Session.add_all

db.session.add_all(items) 
db.session.commit() 

附加的註釋,如果事情是通過循環出問題中途您的交易將回滾只寫你之前在迴路中這可能是不承諾你想,如果你有什麼正在使用交易。例如,如果在循環中途出現錯誤,則列表中只有一半的項目可能寫入數據庫。在循環之外調用commit會保證你的循環已經完成並且將被全部提交或者全部回滾。

相關問題