Python 3.x 当子对象不再被SQLAlchemy中的任何父对象引用时,自动删除该子对象

Python 3.x 当子对象不再被SQLAlchemy中的任何父对象引用时,自动删除该子对象,python-3.x,sqlalchemy,Python 3.x,Sqlalchemy,a和B之间存在多对多关系 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.Colu

a
B
之间存在多对多关系

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
实例的关系

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)

有没有炼金术可以做到这一点?或者我必须自己检查吗?

SQLAlchemy有一个
删除孤儿的级联,您可以阅读。但是,它不适用于多对多关系,因为它要求对象具有“单亲”:

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


这篇文章讨论了与您类似的情况。

我明白了。所以答案是我必须自己处理它,因为没有SQLA或SQL机制来隐式地完成这项工作。但是使用SQLA事件处理程序(就像在您链接的另一个问题中一样)可能会有所帮助。您如何看待使用引用计数器让实例/行知道它不再被引用?