我想使用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
然而,显然是分离的对象仍然是“记住”它有什么ID,即使我将ID设置为无,而这是超脱。 因此,调用Session.flush()尝试执行UPDATE改变主键为空。
这是预期的行为? 我如何删除这个属性的“记忆”,并在重新添加到会话只把分离的对象作为新对象? 如何在一般情况下,没有一个克隆SQLAlchemy的模型实例?
这种情况下可以使用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
def duplicate(self):
arguments = dict()
for name, column in self.__mapper__.columns.items():
if not (column.primary_key or column.unique):
arguments[name] = getattr(self, name)
return self.__class__(**arguments)