SQLAlchemy: 修改分离对象
我想在SQLAlchemy中使用ORM复制一个模型实例(也就是一行数据)。我最开始的想法是这样做:
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设置成了None。因此,session.flush()会尝试执行一个更新,把主键改成空值。
这是正常现象吗?我该如何去掉这个属性的“记忆”,让这个分离的对象在重新加入会话时被当作一个新对象来处理?一般来说,如何克隆一个SQLAlchemy模型实例呢?
2 个回答
1
这段代码的意思是……
首先,它定义了一个函数,这个函数可以用来做某些特定的事情。函数就像一个小工具,你可以随时拿出来用。
接下来,代码里有一些变量。变量就像是存储信息的盒子,你可以把不同的东西放进去,比如数字、文字等等。
然后,代码会执行一些操作,比如计算、判断条件等。计算就像是在做数学题,而判断条件就像是在问“如果这个是真的,那我该怎么做?”
最后,代码会返回一个结果。返回结果就像是把你做的事情的答案给你。
总之,这段代码就是在告诉计算机要做什么,怎么做,以及最后得到什么结果。
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)
43
这个情况可以通过使用 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