为什么级联删除在 PostgreSQL (SQLAlchemy) 中不起作用?

问题描述 投票:0回答:1

我正在尝试级联删除表 Product 中的行,但它不起作用

seller_product = Table(
        "seller_product",
        Base.metadata,
        Column("start_id", Integer, nullable=False),
        Column("id_product", ForeignKey("product.ozon_id", ondelete="CASCADE"), nullable=False),
        Column("id_seller", ForeignKey("seller.ozon_id", ondelete="CASCADE"), nullable=False),
        Column("date_parse", DateTime(), nullable=False, default=datetime.utcnow)
    )


class Product(Base):
    __tablename__ = "product"
    
    id: Mapped["int"] = mapped_column(primary_key=True, autoincrement=True)
    ozon_id: Mapped["int"] = mapped_column(primary_key=True, unique=True)
    title: Mapped["str"] = mapped_column()
    link: Mapped["str"] = mapped_column()
    seller_id: Mapped["int"] = mapped_column(ForeignKey("seller.ozon_id"))
    seller: Mapped["Seller"] = relationship(back_populates="products")

我尝试删除不同的方法:

DELETE FROM seller_product CASCADE WHERE id_product = 4720943812

像这样:

DELETE FROM seller_product CASCADE WHERE start_id = 1

但是产品表中的数据仍然没有被删除。为什么?

python postgresql sqlalchemy
1个回答
0
投票

你对级联方向的思考是倒退的。级联删除将在删除父记录时删除相关的子记录。多对多关系实际上是两个一对多关系的组合:

relationship diagram

请注意,关联表“seller_product”是父表“seller”和产品的子表。如果在数据库级别正确定义了级联删除,则删除“seller”行将删除“seller_product”中的相关行,删除“product”行将删除“seller_product”中的相关行。但是,删除“seller_product”中的行不会删除“seller”或“product”中的相关行。

© www.soinside.com 2019 - 2024. All rights reserved.