Удаление сироты SQLAlchemy "многие ко многим"

StackOverflow https://stackoverflow.com/questions/740630

  •  09-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top