试图解决以下问题:
我有三个类,A和AB,B如下所示:
class AB(Base):
id = Column(Integer, primary_key=True)
a_id = Column(Integer, ForeignKey('a.id'), nullable=False)
a = relationship(
'A',
cascade='save-update',
backref=backref(
'abs',
cascade='save-update',
uselist=True
)
)
b_id = Column(Integer, ForeignKey('b.id'), nullable=False)
b = relationship(
'B',
cascade='save-update',
backref=backref(
'abs',
cascade='save-update',
uselist=True
)
)
__tablename__ = 'ab'
class A(Base)
id = Column(Integer, primary_key=True)
__tablename__ = 'a'
class B(Base)
id = Column(Integer, primary_key=True)
__tablename__ = 'b'
A本质上,这是和之间的 m2m 关系B。id唯一不标准的是表中有一个列AB。它的存在是有原因的。
我想实现两个实例的“合并” A。我们得到a1和a2。然后,在删除 之前a1,它与ABs 的所有关系都应该重新分配给a2。在流程中保留 的值至关重要(因此,实际上不应创建或删除AB.id的新实例)。AB
问题无论我如何尝试,每次我删除一个实例时A,SQLAlchemy 都会尝试用一个NULL值更新 foreign_key,从而打破NOT NULL约束。它通过发出明确的UPDATE ab SET a_id = NULL WHERE id = .... 即使我的程序中有以下循环,它也会这样做:
for ab in a1.abs:
ab.a_id = a2.id
session.db.add(ab)
session.db.delete(a1)
因此,在我看来,在发出 delete 之前,所有ab相关的 sa1都已安全移动到a2,但是出了点问题。
一些非解决方案
passive_deletes国旗。行为上的差异仅涉及那些尚未在内存中的行,这是不好的。- 添加
delete级联对我来说风险很大。我想真正确保ab在合并过程中不会丢失任何对象。 - 手动更新保存在关联中的列表似乎没有任何效果(
UPDATE再次发布)。
非常感谢您的帮助!