试图解决以下问题:
我有三个类,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
,它与AB
s 的所有关系都应该重新分配给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
再次发布)。
非常感谢您的帮助!