2012-08-31 41 views
4

我需要将一个对象附加到会话,以便它不会与在db中保留的对象不同。 (更容易用代码解释):在sqlalchemy中刷新分离的实体

session.query(type(some_object)).filter_by(id=some_object.id).one() 

有没有更正确的方法来做到这一点? session.add(some_object)不起作用,因为具有此ID的实体可能已经附加到此会话,并且object = session.merge(some_object)不适用于我,因为它将状态从分离的副本转换(如果我使object.name ='asdfasdf'这些更改将是合并对象)后挂起

编辑:

我发现了一个有点丑陋的方式少:

some_object = session.merge(some_object) 
session.refresh(some_object) 

但有这样一个待办事项这一个电话?

回答

5

我需要以这样一种方式附加一个对象到会话,它不会与一个持久化在db中的对象不同。 “

”与DB不会有区别“几乎意味着您正在寻找加载它,因此查询它。您可能想要考虑该对象可能已经存在于该目标会话中。所以你的方法与查询(类型(对象))可能是最直接的,虽然你可以使用get()直接击中主键,populate_existing()以保证会话中已经存在的状态被覆盖:

session.query(type(some_object)).populate_existing().get(some_object.id) 

以上调用几乎相同的代码路径refresh()。您也可以使用合并/刷新方法,但至少会发出两个SELECT调用。

+0

谢谢,这正是我一直在寻找的! – Zozz

+0

谢谢你,为我工作 – jdurango