如何在sqlalchemy中获取级联删除(或标记为删除)项目的ID?

时间:2012-04-12 13:00:00

标签: python sql postgresql sqlalchemy cascading-deletes

当我级联删除一个项目时,我想获取所有已删除项目ID(主键)的列表,包括已删除子项的ID。有可能吗?

我的班级看起来像:

class Example(Base):
    __tablename__ = 'example'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('example.id', ondelete='CASCADE'), nullable=True)
    childrens = relationship('Example', backref=backref('parent', remote_side=[id], cascade="all, delete"))

我查询如下:

session.query(Example).filter(Example.id == id).delete()

1 个答案:

答案 0 :(得分:1)

我所知道的唯一真正的解决方案是使用触发器。有一个通用的触发器来处理这种类型的问题,它已经被提交到PostgreSQL项目作为9.2的可安装扩展(预计将在今年夏天发布)。如果您的python环境支持PostgreSQL LISTEN / NOTIFY功能,您可以下载它并使用9.1或9.0。 (我们[威斯康星州的法院系统]已将它与生产一起使用了几个月。)我担心,在版本9.2发布之前,您需要能够从源代码构建它。如果你以前没有这样做过,那么这个页面的底部应该是一个好的开始:

http://www.postgresql.org/docs/devel/static/contrib.html

您可以在此处找到扩展程序的源代码:

http://git.postgresql.org/gitweb/?p=postgresql.git;a=tree;f=contrib/tcn;h=aa9c5813223a3996e22cabbf064d7243fa474c6c;hb=HEAD

...您现在可以在这里找到文档:

http://www.postgresql.org/docs/devel/static/tcn.html

您需要创建一个触发器,在您想要通知的每个表上执行此触发器功能。 DML是直接还是间接无关紧要,如通过外键定义的ON DELETE CASCADE子句。虽然文档提供了一个示例,其中函数附加到所有 DML,但如果这是您需要的,则可以将其附加到DELETE,如下所示:

create trigger example_tcn_trigger
  after delete on example
  for each row execute procedure triggered_change_notification();

完全披露:我为威斯康星州法院系统写了这篇文章,他们允许我与PostgreSQL社区分享。