【问题标题】:SQLAlchemy many-to-many orphan deletionSQLAlchemy 多对多孤儿删除
【发布时间】:2010-10-18 22:40:21
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 我认为在没有更多关于代码的细节的情况下回答这个问题可能有点棘手(你是如何设置多对多关系的,你把删除孤儿放在哪里,等),大致是什么架构等。
  • 我在 backref 和正常的关系()上尝试了 delete-orphan。关系基本上是mapper(User, users, properties={'groups': relation=relation(Group, secondary=users_groups, backref=backref('users'))})

标签: python sqlalchemy


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 在 SA 0.6 中:The 'delete-orphan' cascade option requires 'delete'
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-24
        • 1970-01-01
        • 1970-01-01
        • 2011-01-02
        • 2012-10-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多