9

我正在尝试使用 SQLAlchemy 来实现一个基本的用户组模型,其中用户可以有多个组,组可以有多个用户。

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

问题是 cascade='all, delete-orphan' 不完全符合我的要求;当组为空时,它不会删除组,而是在任何成员离开组时删除组。

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

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

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

4

4 回答 4

3

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

于 2009-04-18T10:29:31.813 回答
3

我想你想要cascade='save, update, merge, expunge, refresh, delete-orphan'。这将防止“删除”级联(您从“全部”获得)但保持“删除孤儿”,这是您正在寻找的,我认为(当没有更多父母时删除)。

于 2009-04-20T22:00:12.727 回答
2

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

但是扩展 SA 很容易,您可以使用AttributeExtension来检查从用户中删除组时是否为空并从那里删除。

于 2009-04-29T18:15:16.487 回答
0

您可以发布您的表格和映射器设置的示例吗?可能更容易发现正在发生的事情。

不看代码很难说,但也许关系的方向有问题?

于 2009-04-22T08:48:37.403 回答