在SQLAlchemy中,可以防止(或专门引发自定义Exception)以多对多关系删除作为集合一部分的对象。
例如,下面有一个Party
和Person
。任何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>
答案 0 :(得分:0)
将标签viewonly=True
添加到:
parties = db.relationship('Party', secondary=party_person_ass_table, back_populates='people', viewonly=True)
将Person
与party_person_ass_table
分离,并且在修改后不会自动删除关联表中的行,这会破坏数据库的完整性。
这也是为什么注释“ ON DELETE RESTRICT”失败的原因,因为它不是固有的级联,但是SQLAlchemy专门删除了这些行作为其功能的一部分,因此不会以通常的方式调用这些钩子。