2011-09-19 111 views

回答

15

以下是documentation的一些相關引用。

沖洗

Session使用其默認配置,沖洗 步驟幾乎都是透明完成的。具體來說,沖洗 出現在任何單個查詢發出之前,以及 commit()調用之前發生的事務提交

提交

commit()用於提交當前事務。 它總是預先發出 flush()以將任何剩餘狀態清除到數據庫;此 獨立於「自動刷新」設置。如果目前沒有交易 ,則會引發錯誤。請注意,會話的默認行爲是「交易」始終存在;通過設置autocommit=True可以禁用此行爲 。在自動提交模式下,可以通過調用begin()方法啓動 交易。

4

直:

commit()用於提交當前事務。它總是事先發出flush()以將任何剩餘狀態清除到數據庫。

9

我知道該怎麼解釋這是什麼做的最簡單的方法是隻告訴你,使用echo=True

>>> session.flush() 
BEGIN (implicit) 
INSERT INTO users (username, password) VALUES (?, ?) 
('alice', None) 
>>> session.commit() 
COMMIT 
>>> 

flush()導致數據被髮送到數據庫。 commit()導致COMMIT,它告訴數據庫保留剛剛發送的數據。正如其他人所說,如果需要,commit()也將導致發生flush()

3

雖然上述答案是正確的,但flush的最有用的功能是將對數據庫中的表所做的更改應用到代碼中的相關對象中。下面是一個例子, 假設你註冊一個用戶,你想給回他的身份證,

u = User(name,address,phone) #id is autogenerated 
session.add(u) 
session.commit() #calls flush beforehand, but we need it after the commit 
session.flush() #updates the objects of the session 
print(u.id) #id field of the User object updated after the flush 

您不必再查詢得到他的ID!希望這有助於

0

flush()將保存在存儲器中的對象/對象的當前狀態同步您的數據庫,但它不提交事務。因此,如果您在調用flush()後遇到任何異常,那麼交易將被回滾。 您可以使用flush()同步數據庫與小塊數據,而不是使用commit()立即提交大量數據,並面臨獲取異常的風險。

commit()將使數據庫中的數據永久存儲。一旦commit()成功,您無法回滾您的交易。

來源:https://stackoverflow.com/a/26976077/4115031

相關問題