SQLAlchemy:分离对象的修改

EB.*_*EB. 20 python clone sqlalchemy instance duplicates

我想使用orm在SQLAlchemy中复制模型实例(行).我的第一个想法是这样做:

i = session.query(Model)
session.expunge(i)

old_id = i.id
i.id = None
session.add(i)
session.flush()
print i.id #New ID
Run Code Online (Sandbox Code Playgroud)

然而,显然分离的对象仍然"记住"它具有的id,即使我在分离时将id设置为None.因此,session.flush()尝试执行UPDATE,将主键更改为null.

这是预期的行为吗?如何删除此属性的"内存",并在将重新添加到会话时将其作为新对象处理?一般来说,如何克隆SQLAlchemy模型实例?

zzz*_*eek 36

这种情况可以使用make_transient()辅助函数:

inst = session.query(Model).first()
session.expunge(inst)

make_transient(inst)
inst.id = None
session.add(inst)
session.flush()
print inst.id #New ID
Run Code Online (Sandbox Code Playgroud)

  • 什么是复制关系的正确方法,@ zzeek? (4认同)