SQLAlchemy удаление многих для многих сирот - PullRequest
8 голосов
/ 11 апреля 2009

Я пытаюсь использовать SQLAlchemy для реализации базовой модели групп пользователей, в которой пользователи могут иметь несколько групп, а группы могут иметь несколько пользователей.

Когда группа становится пустой, я хочу, чтобы группа была удалена (наряду с другими вещами, связанными с группой. К счастью, каскад SQLAlchemy прекрасно работает в этих более простых ситуациях).

Проблема в том, что cascade = 'all, delete-orphan' не делает именно то, что я хочу; вместо удаления группы, когда группа становится пустой, она удаляет группу, когда любой участник покидает группу.

Добавление триггеров в базу данных прекрасно работает для удаления группы, когда она становится пустой, за исключением того, что триггеры, кажется, обходят каскадную обработку SQLAlchemy, поэтому вещи, связанные с группой, не удаляются.

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

Я понимаю, что я мог бы сделать это вручную, найдя каждое место в моем коде, где пользователь может покинуть группу, и затем сделать то же самое, что и триггер, однако, я боюсь, что я пропущу места в коде (и Я ленивый).

Ответы [ 4 ]

3 голосов
/ 21 апреля 2009

Я думаю, что вы хотите cascade='save, update, merge, expunge, refresh, delete-orphan'. Это предотвратит каскад «удаления» (который вы получаете от «всех»), но сохранит «удалить-сироту», то, что вы ищете, я думаю (удалить, когда больше нет родителей).

3 голосов
/ 18 апреля 2009

Способ, которым я обычно справляюсь, состоит в том, чтобы иметь функцию для вашего пользователя или группы, называемую оставляемой_группой. Когда вы хотите, чтобы пользователь покинул группу, вы вызываете эту функцию и можете добавлять туда любые побочные эффекты. В долгосрочной перспективе это позволяет добавлять все больше и больше побочных эффектов. (Например, если вы хотите проверить, что кому-то разрешено покидать группу).

2 голосов
/ 29 апреля 2009

У меня была такая же проблема около 3 месяцев назад, у меня есть отношение Post / Tags и я хотел удалить неиспользуемые теги. Я спросил об irc, и автор SA сказал мне, что каскады для отношений «многие ко многим» не поддерживаются, что имеет смысл, поскольку в «многие ко многим» нет «родителя».

Но расширить SA легко, вероятно, вы можете использовать AttributeExtension , чтобы проверить, стала ли группа пустой при удалении из Пользователя, и удалить ее оттуда.

0 голосов
/ 22 апреля 2009

Не могли бы вы опубликовать образец вашей таблицы и настройки картографа? Возможно, будет легче определить, что происходит.

Не видя код, трудно сказать, но, возможно, что-то не так с направлением отношений?

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