gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 18:52:35 25 4
gpt4 key购买 nike

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

我的类(class)看起来像:

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()

最佳答案

据我所知,唯一真正的解决方案是使用触发器。有一个用于处理此类问题的通用触发器,它已作为 9.2 的可安装扩展(预计将于今年夏天发布)提交给 PostgreSQL 项目。如果您的 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 社区分享。

关于python - 如何获取 sqlalchemy 中级联删除(或标记为删除)项目的 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10124077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com