在sqlalchemy中刷新分离的实体

时间:2012-08-31 08:25:00

标签: python session sqlalchemy

我需要将一个对象附加到会话,使其与db中持久化的对象不同。 (更容易用代码解释):

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)

但是在一次通话中有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:5)

  

我需要将一个对象附加到会话中,使其与db中持久存在的对象不同。

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

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

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