SQLAlchemy: 修改分离对象

25 投票
2 回答
11799 浏览
提问于 2025-04-17 14:22

我想在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

撰写回答