SQLAlchemy多对多孤儿删除

时间:2009-04-11 19:07:18

标签: python sqlalchemy

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

当一个组变空时,我希望删除该组(以及与该组相关的其他内容。幸运的是,SQLAlchemy的级联可以在这些更简单的情况下正常工作)。

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

向数据库添加触发器可以在组变空时正常删除,除非触发器似乎绕过SQLAlchemy的级联处理,因此与该组关联的内容不会被删除。

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

我明白我可以手动执行此操作,方法是在我的代码中查找用户可以离开组的所有位置然后执行与触发器相同的操作但是,我担心我会错过代码中的位置(和我很懒。)

4 个答案:

答案 0 :(得分:3)

我通常处理此问题的方法是在您的用户或组中使用名为leave_group的函数。当您希望用户离开某个组时,您可以调用该功能,并且可以在其中添加所需的任何副作用。从长远来看,这可以更容易地添加更多和更多的副作用。 (例如,当您想要检查某人是否被允许离开一个团队时)。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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

没有看到代码就很难说,但是关系的方向可能有问题吗?

相关问题