SQLAlchemy:flush()和commit()之間有什麼區別?

SQLAlchemy中flush()commit()的區別是什麼? 數據庫

我已經閱讀了文檔,但沒有更明智 - 他們彷佛假設我沒有預先理解。 session

我對它們對內存使用的影響特別感興趣。 我正在從一系列文件(總共約500萬行)中將一些數據加載到數據庫中,而且個人會話偶爾會崩潰 - 它是一個大型數據庫和一臺內存不足的機器。 this

我想知道我是否使用了太多的commit()和沒有足夠的flush()調用 - 可是若是沒有真正理解差別是什麼,那就很難說了! spa


#1樓

正如@snapshoe所說 code

flush()將您的SQL語句發送到數據庫 對象

commit()提交事務。 事務

session.autocommit == False 內存

若是設置autoflush == True commit()將調用flush()rem

session.autocommit == True 文檔

若是您還沒有啓動事務(您可能沒有,由於您可能只使用此模式來避免手動管理事務),則沒法調用commit() )。

在此模式下,必須調用flush()以保存ORM更改。 有效刷新也會提交您的數據。


#2樓

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')>]
相關文章
相關標籤/搜索