防止删除某些集合中的对象

时间:2019-04-14 20:28:26

标签: sqlalchemy many-to-many

在SQLAlchemy中,可以防止(或专门引发自定义Exception)以多对多关系删除作为集合一部分的对象。

例如,下面有一个PartyPerson。任何Party可以有许多Persons,任何Person可以有许多Parties

如果记录了Person会去一个或多个Parties,我想禁止删除该Person

party_person_ass_table = db.Table('party_person', db.Model.metadata,
                     db.Column('party_id', db.ForeignKey('party.id'), primary_key=True),
                     db.Column('person_id', db.ForeignKey('person.id'), primary_key=True))

class Party(db.Model):
    ... 
    people = db.relationship('Person', secondary=party_person_ass_table, back_populates='parties')

class Person(db.Model):
    ... 
    parties = db.relationship('Party', secondary=party_person_ass_table, back_populates='people')

阅读文档时,似乎会自动设置从辅助表中级联删除(https://docs.sqlalchemy.org/en/13/orm/basic_relationships.html)。我想知道是否生成IntegrityError的解决方案是在辅助关联表的nullable=False列中添加person_id,然后以某种方式防止级联删除影响辅助表? / p>

1 个答案:

答案 0 :(得分:0)

将标签viewonly=True添加到:

parties = db.relationship('Party', secondary=party_person_ass_table, back_populates='people', viewonly=True)

Personparty_person_ass_table分离,并且在修改后不会自动删除关联表中的行,这会破坏数据库的完整性。

这也是为什么注释“ ON DELETE RESTRICT”失败的原因,因为它不是固有的级联,但是SQLAlchemy专门删除了这些行作为其功能的一部分,因此不会以通常的方式调用这些钩子。