5

我需要将一个对象附加到会话中,使其与数据库中持久的对象没有区别。(用代码更容易解​​释):

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)

但是有没有办法在一个电话中做到这一点?

4

1 回答 1

5

我需要将一个对象附加到会话中,使其与数据库中持久的对象没有区别。

“不会与 DB 不同”几乎意味着您正在寻找加载它,因此请查询它。您可能要考虑该对象可能已经存在于该目标会话中。因此,您使用 query(type(object)) 的方法可能是最直接的,尽管您可以使用 get() 直接命中主键,并使用 populate_existing() 来保证会话中已经存在的状态被覆盖:

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

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

于 2012-09-01T13:45:11.883 回答