Запретить удаление объекта в какой-либо коллекции - PullRequest
0 голосов
/ 14 апреля 2019

В SQLAlchemy можно предотвратить (или специально вызвать пользовательское исключение) удаление объекта, являющегося частью коллекции, в отношении «многие ко многим».

Например, ниже у меня есть 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 в вторичной ассоциации, а затем каким-то образом предотвратить каскадное удаление от воздействия на вторичную таблицу?

1 Ответ

0 голосов
/ 20 апреля 2019

добавление тега 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 специально удаляет эти строки как часть своей функции, поэтому эти ловушки не вызываются обычным способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...