SQLAlchemy: как отключить обработку внешнего ключа на уровне ORM при удалении? - PullRequest
0 голосов
/ 29 апреля 2020

Я узнал, что SQLAlchemy реализует некоторую обработку внешнего ключа, например, устанавливает их в NULL при удалении родителя, отдельно от базы данных, что означает, что они могут быть настроены на разные варианты поведения, и разные способы выполнения одной и той же вещи могут получить либо один. Пример:

У меня есть Comment и Subscription, где Subscription имеет отношение внешнего ключа к Comment. Я начал с установки backref = backref('subs', cascade = 'delete, delete-orphan') для отношения Subscription, и в результате session.delete(comment) удаляло бы подписки на комментарии правильно, но session.query(Comment).filter_by(id = id).delete() не получилось бы с нарушением внешнего ключа, потому что был установлен каскад на уровне ORM вместо уровня Postgres.

Само собой разумеется, я нахожу это очень запутанным, и я хочу отключить его, чтобы вся обработка внешнего ключа при удалении выполнялась Postgres. Я не нахожу очевидного способа сделать это, просматривая документы. Я читал о пассивном удалении , который звучит так, как будто он делает то, что я хочу, за исключением того, что он не применяется к объектам, уже загруженным в сеанс.

Есть ли способ отключить все ORM- уровень обработки внешнего ключа при удалении? И есть ли веская причина не делать этого?

1 Ответ

0 голосов
/ 08 мая 2020

Да, я попробовал пассивное удаление, и кажется, что он делает то, что мне нужно, в конце концов. Слова «cascade="all, delete-orphan" будут вступать в силу для экземпляров MyOtherClass, которые в данный момент присутствуют в сеансе», заставили меня подумать, что он по-прежнему будет вручную удалять удаления для зависимых объектов, если они будут добавлены в сеанс , но если я получаю зависимый объект, а затем зависимый, а затем изменяю зависимый, проверяя, что он находится в session.dirty, а затем удаляя зависимый и фиксируя, SQLAlchemy не выдает вручную удаление зависимого объекта.

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