Я узнал, что 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- уровень обработки внешнего ключа при удалении? И есть ли веская причина не делать этого?