You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置FastAPI PostgreSQL模型级联删除:删除Book同步删Bookmark

实现Book删除时自动删除关联BookMark的SQLAlchemy配置

你当前的代码在级联配置的位置上有问题,需要调整relationship的cascade参数位置,同时结合数据库级的外键级联来实现需求。以下是修正后的完整代码:

from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship

Base = declarative_base()

class Book(Base):
    __tablename__ ="book"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    title = Column(String, nullable=False)
    description = Column(String, nullable=True)

    # 父表关系配置:添加cascade和passive_deletes
    r_bookmark = relationship("BookMark", back_populates="r_book", cascade="all, delete-orphan", passive_deletes=True)


class BookMark(Base):
    __tablename__ ="bookmark"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    title = Column(String, nullable=False)
    description = Column(String, nullable=True)
    # 保留数据库级的ondelete='CASCADE',确保直接操作数据库也能触发级联
    book_id = Column(Integer, ForeignKey("book.id", ondelete='CASCADE'), nullable=False)

    # 反向关系无需cascade配置
    r_book = relationship("Book", back_populates="r_bookmark")

关键配置说明

  • 数据库级联(ondelete='CASCADE'):这个配置在数据库层面生效,就算你直接用SQL语句删除Book记录,数据库也会自动清理关联的BookMark,避免数据残留。
  • ORM级联(cascade="all, delete-orphan"):让SQLAlchemy在通过ORM删除Book对象时,自动处理关联BookMark的删除。如果不需要“当BookMark脱离Book关联时自动删除”的功能,改成cascade="all, delete"即可。
  • passive_deletes=True:配合数据库级联使用,告诉ORM不用手动处理关联对象的删除,避免和数据库的级联操作冲突。

测试验证

  1. 通过ORM操作:获取Book对象后执行session.delete(book_obj),提交事务后关联的BookMark会被自动删除。
  2. 直接操作数据库:执行DELETE FROM book WHERE id = 1;,数据库会自动删除所有book_id=1的BookMark记录。

内容的提问来源于stack exchange,提问作者fudu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 08:18:23