2013-10-02 26 views
10

嗯,我正在處理對sqlalchemy和對象令人耳目一新的疑問!關於在sqlalchemy會話中刷新對象

我在我有2次會議的情況,並在同一物體在兩個會議上被質疑!...對於一些特別的事情,我不能關閉的會議之一。 我修改了對象並提交了會話A中的更改,但在會話B中,屬性是最初的!無需修改!..

所以......我應當實行某種形式的通知系統進行通信的變化或有一個內置的方式在SQLAlchemy中做到這一點?

+1

http://stackoverflow.com/a/18684124/1309352 –

+0

這可以很好的幫助:http://stackoverflow.com/a/25694346/134904 – kolypto

回答

17

Sessions are designed to work like this。會話B中對象的屬性將保持它在會話B中首次查詢時的對象的屬性。此外,SQLAlchemy在更改時不會嘗試自動刷新其他會話中的對象,也不認爲嘗試創建某些內容會是明智的做法喜歡這個。

您應該積極考慮每個會話的生命週期作爲數據庫中的單個事務。會話如何以及何時需要處理其對象可能陳舊的事實並不是可以通過內置於SQLAlchemy(或SQLAlchemy的任何擴展)中的算法來解決的技術問題:這是一個「業務」問題,您必須解決其解決方案確定和編碼你自己。 「正確的」響應可能是說這不是問題:如果在會話B啓動時使用數據,則會話B發生的邏輯可能是有效的。你的「問題」實際上可能不成問題。該文檔實際上有一個entire section on when to use sessions,但它提供了一個非常嚴峻的響應,如果你希望一個放之四海而皆準的解決辦法...

會話是在邏輯 操作的開始通常由數據庫訪問可能被預期。

會話,只要它是用來談論到數據庫,只要它開始通信開始一個 數據庫事務。假設 自動提交標誌留在其推薦的假默認情況下,直到Session被回滾, 承諾,或關閉該 交易仍在進行。如果在前一個交易結束之後再次使用 ,則會話將開始新的交易;從 這可以得出結論,該會話能夠在許多交易中具有使用期限 ,儘管每次只有一個。我們將這兩個概念稱爲事務範圍和會話範圍。

這裏的含義是,SQLAlchemy的ORM正在鼓勵 開發者在他或她的申請,以建立這兩個領域, 不僅包括在範圍開始和結束,也延展的範圍的 ,例如應的單個會話例如是本地 到的函數或方法內執行流,應該由整個申請中使用的 全局對象,或在 這兩者之間的某個地方。

開發人員確定此範圍的負擔是一個區域 ,其中SQLAlchemy ORM必須對如何使用數據庫有強烈的意見。工作模式的單位是專門 一個積累隨時間的變化,並定期沖洗它們, 保存內存狀態的同步與什麼已知存在於 本地事務。只有在有意義的事務範圍 到位時,此模式纔有效。

這就是說,有一些事情可以做,以改變這種狀況是如何工作的:

首先,可以減少你的會話保持打開的時間。會話B正在查詢對象,稍後您將對該對象(在同一會話中)進行一些操作,以便使屬性保持最新。一個解決方案是在單獨的會話中完成第二個操作。

另一種是使用到期/刷新方法,爲docs show ...

# immediately re-load attributes on obj1, obj2 
session.refresh(obj1) 
session.refresh(obj2) 

# expire objects obj1, obj2, attributes will be reloaded 
# on the next access: 
session.expire(obj1) 
session.expire(obj2) 

即使會話已經可以使用session.refresh()立即獲取對象的上的最新版本,早些時候詢問對象。

+0

Thx!我想說我已經閱讀了完整的會話文檔。但是,即使這樣做了,我在解決開始會話的位置以及在應用程序代碼中結束它的位置出現了一些問題,這不在文檔中。 –

+0

何時以及如何使用會話將會因應用程序而異。沒有一種適合所有人的解決方案,並描述瞭如何確定可能是整本書本身的過程。所以,不要覺得你不確定如何去做,因爲這不是一個簡單的問題。 –

+0

好吧,說這個,我覺得創建一個滿足我需求的工作流程更加自由,並且不要試圖找到一個不存在的模式! –

相關問題