Python SQLAlchemy多对多孤立删除

Python SQLAlchemy多对多孤立删除,python,sqlalchemy,Python,Sqlalchemy,我试图使用SQLAlchemy实现一个基本的用户组模型,其中用户可以有多个组,组可以有多个用户 当一个组变为空时,我希望删除该组(以及与该组相关的其他内容。幸运的是,SQLAlchemy的级联可以很好地处理这些更简单的情况) 问题是cascade='all,delete orphan'并不能完全满足我的要求;它不会在组变为空时删除该组,而是在任何成员离开该组时删除该组 在数据库中添加触发器可以在组变为空时删除组,但触发器似乎绕过了SQLAlchemy的级联处理,因此与组相关的内容不会被删除 当一

我试图使用SQLAlchemy实现一个基本的用户组模型,其中用户可以有多个组,组可以有多个用户

当一个组变为空时,我希望删除该组(以及与该组相关的其他内容。幸运的是,SQLAlchemy的级联可以很好地处理这些更简单的情况)

问题是cascade='all,delete orphan'并不能完全满足我的要求;它不会在组变为空时删除该组,而是在任何成员离开该组时删除该组

在数据库中添加触发器可以在组变为空时删除组,但触发器似乎绕过了SQLAlchemy的级联处理,因此与组相关的内容不会被删除

当一个组的所有成员都离开并将此删除级联到相关实体时,删除该组的最佳方式是什么


我知道我可以通过在我的代码中找到用户可以离开组的每个位置,然后执行与触发器相同的操作来手动执行此操作。但是,我担心我会错过代码中的位置(而且我很懒)。

我通常处理此问题的方法是在您的用户或组上有一个名为leave\u group的函数。当您希望用户离开某个组时,您可以调用该函数,并可以在其中添加任何您想要的副作用。从长远来看,这使得增加越来越多的副作用变得更加容易。(例如,当您希望检查是否允许某人离开某个组时)。

我认为您需要
cascade='save、update、merge、expunge、refresh、delete orphan'
。这将阻止“删除”级联(从“全部”中获得),但保留“删除孤立项”,我认为这是您正在寻找的(在没有更多父项时删除)。

您可以发布一个表和映射设置的示例吗?可能更容易发现发生了什么


如果看不到代码,很难判断,但可能关系的方向有问题?

大约3个月前,我遇到了同样的问题,我有一个Post/Tags关系,希望删除未使用的标记。我在irc上问过,SA的作者告诉我,不支持多对多关系上的级联,这是有道理的,因为在多对多关系中没有“父”


但是扩展SA很容易,您可能可以使用a检查从用户中删除组时该组是否变为空,然后将其删除。

我认为在没有更多代码细节的情况下回答这个问题可能有点棘手(您是如何设置多对多关系的,您将删除孤立项放在了哪里,等等),大致模式是什么,等等。我在backref和normal relation()上尝试了delete-orphan。SA0.6中的关系基本上是映射器(用户、用户、属性={'groups':relation=relation(Group,secondary=users\u groups,backref=backref('users'))}):
delete-orphan级联选项需要“delete”