2011-11-24 79 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

相关问题