我需要将一个对象附加到会话,使其与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)
但是在一次通话中有没有办法解决这个问题?
答案 0 :(得分:5)
我需要将一个对象附加到会话中,使其与db中持久存在的对象不同。
“与DB没有区别”几乎意味着你要加载它,所以查询它。您可能希望考虑该对象可能已存在于该目标会话中。所以你的查询方法(类型(对象))可能是最直接的,虽然你可以使用get()直接命中主键,populate_existing()可以保证会话中已经存在的状态被覆盖:
session.query(type(some_object)).populate_existing().get(some_object.id)
上面调用了refresh()
几乎相同的代码路径。您也可以使用合并/刷新方法,但至少会发出两次SELECT调用。