当SQLAlchemy中的任何父对象不再引用子对象时,自动删除子对象



AB之间存在多对多关系

a_b_relation= sa.Table('a_b_relation', _Base.metadata,
    sa.Column('a_oid', sa.Integer, sa.ForeignKey('A.oid')),
    sa.Column('b_oid', sa.Integer, sa.ForeignKey('B.oid'))
)

class A(_Base):
    __tablename__ = 'A'
    _oid = sa.Column('oid', sa.Integer, primary_key=True)
    _bbb = sao.relationship('B', secondary=a_b_relation)

class B(_Base):
    __tablename__ = 'B'
    _oid = sa.Column('oid', sa.Integer, primary_key=True)

一个B实例可以被多个A实例引用。但是当没有引用时,应该自动删除B。关键是没有删除A实例!它们只是将关系修改为B的另一个实例。

是否有SQLAlchemy方法来做到这一点?还是我要自己检查一下?

SQLAlchemy有一个delete-orphan级联,您可以在这里阅读。然而,它不适用于多对多关系,因为它要求对象具有"单亲":

delete-orphan cascade意味着每个子对象一次只能有一个父对象,因此在绝大多数情况下是在一对多关系上配置的。将其设置为多对一或多对多关系会更尴尬;对于这个用例,SQLAlchemy要求用single_parent参数配置relationship(),建立python端验证,确保对象一次只与一个父对象关联。

这个问题讨论的情况和你的问题类似。

最新更新