2011-11-24 80 views
34

由於種種原因,我想獲得對象的集合從數據庫中,並把它傳遞給未連接到數據庫的另一個進程。我的代碼看起來像下面的一個,但我不斷收到的SQLAlchemy,獲取對象不會綁定到一個會話

sqlalchemy.exc.UnboundExecutionError: Instance <MyClass at 0x8db7fec> is not bound to a Session; attribute refresh operation cannot proceed 

當我嘗試看看我的列表get_list()方法之外的元素。

def get_list (obj): 
    sesson = Session() 
    lst = session.query(MyClass).all() 
    session.close() 
    return lst 

但是,如果我用這個

def get_list_bis (obj) 
    session = Session() 
    return session.query(MyClass).all() 

我能夠使用的元素,但擔心會話的狀態,因爲它沒有關閉。

缺少什麼我在這裏?

回答

39

如果你想了一堆通過查詢會話是會話範圍之外的可用生產的對象,你需要expunge他們的會話。

在你的第一個功能例如,您將需要添加一行:

session.expunge_all() 

session.close() 

更一般地,我們說會話沒有在第一封閉向右走,像例。也許這是一個會話,在Web請求的整個持續時間或類似的事件中保持活動狀態。在這種情況下,你不想做expunge_all。你會想更多的手術:

for item in lst: 
    session.expunge(item) 
+17

可是......可是......真正的循環「的close()方法發出expunge_all(),並釋放任何事務/連接資源。」該聲明位於您引用的頁面上,至少回到0.6版。 – Oddthinking

1

以我爲例,我是節約了相關實體,以及,這個配方幫助我refresh所有實例在會話中,利用一個事實,即會話是迭代:

map(session.refresh, iter(session)) # call refresh() on every instance 

這是非常無效的,但工程。單元測試應該沒問題。

最後說明一點:在Python3 map()是發電機,不會做任何事情。使用列表內涵

+4

無論如何,如果你不關心結果,你不應該使用'map'。 – ThiefMaster

相關問題