SQLAlchemy中flush()
和commit()
的區別是什麼? 數據庫
我已經閱讀了文檔,但沒有更明智 - 他們彷佛假設我沒有預先理解。 session
我對它們對內存使用的影響特別感興趣。 我正在從一系列文件(總共約500萬行)中將一些數據加載到數據庫中,而且個人會話偶爾會崩潰 - 它是一個大型數據庫和一臺內存不足的機器。 this
我想知道我是否使用了太多的commit()
和沒有足夠的flush()
調用 - 可是若是沒有真正理解差別是什麼,那就很難說了! spa
正如@snapshoe所說 code
flush()
將您的SQL語句發送到數據庫 對象
commit()
提交事務。 事務
session.autocommit == False
: 內存
若是設置autoflush == True
commit()
將調用flush()
。 rem
當session.autocommit == True
: 文檔
若是您還沒有啓動事務(您可能沒有,由於您可能只使用此模式來避免手動管理事務),則沒法調用commit()
)。
在此模式下,必須調用flush()
以保存ORM更改。 有效刷新也會提交您的數據。
Session對象基本上是對數據庫的更改(更新,插入,刪除)的持續事務。 這些操做在提交以前不會持久保存到數據庫中(若是您的程序在會話中間事務中因爲某種緣由而停止,則會丟失任何未提交的更改)。
會話對象使用session.add()
註冊事務操做,但在調用session.flush()
以前還沒有將它們傳遞給數據庫。
session.flush()
將一系列操做傳遞給數據庫(插入,更新,刪除)。 數據庫將它們維護爲事務中的掛起操做。 在數據庫收到當前事務的COMMIT(這就是session.commit()
所作的事情session.commit()
以前,更改不會永久保留到磁盤或對其餘事務可見。
session.commit()
將這些更改提交(持久)到數據庫。
flush()
始終做爲對commit()
( 1 )的調用的一部分進行調用。
當您使用Session對象查詢數據庫時,查詢將返回數據庫和它所擁有的未提交事務的刷新部分的結果。 默認狀況下,會話對象會自動autoflush
其操做,但能夠禁用此操做。
但願這個例子能讓我更清楚:
#--- s = Session() s.add(Foo('A')) # The Foo('A') object has been added to the session. # It has not been committed to the database yet, # but is returned as part of a query. print 1, s.query(Foo).all() s.commit() #--- s2 = Session() s2.autoflush = False s2.add(Foo('B')) print 2, s2.query(Foo).all() # The Foo('B') object is *not* returned # as part of this query because it hasn't # been flushed yet. s2.flush() # Now, Foo('B') is in the same state as # Foo('A') was above. print 3, s2.query(Foo).all() s2.rollback() # Foo('B') has not been committed, and rolling # back the session's transaction removes it # from the session. print 4, s2.query(Foo).all() #--- Output: 1 [<Foo('A')>] 2 [<Foo('A')>] 3 [<Foo('A')>, <Foo('B')>] 4 [<Foo('A')>]