2015-09-20 79 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

相關問題