2015-09-20 80 views
1

AB之间存在多对多关系。在SQLAlchemy中的任何父项不再引用时自动删除子对象

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的方法来做到这一点?或者我必须自己检查一下吗?

回答

2

SQLAlchemy有一个delete-orphan级联,您可以阅读有关here。但是,它不为许多,因为它要求对象具有“单亲”工作,以一对多的关系:

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

question讨论了与您类似的情况。

+0

我明白了。所以答案将是我必须自己处理它,因为没有任何SQLA或SQL机制可以完成工作。但是使用SQLA事件处理程序(就像在你链接的其他问题中一样)可以帮助解决这个问题。 – buhtz

+0

您认为如何使用reference-counters让实例/行知道它不再被引用? – buhtz

相关问题