如何配置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不用手动处理关联对象的删除,避免和数据库的级联操作冲突。
测试验证
- 通过ORM操作:获取Book对象后执行
session.delete(book_obj),提交事务后关联的BookMark会被自动删除。 - 直接操作数据库:执行
DELETE FROM book WHERE id = 1;,数据库会自动删除所有book_id=1的BookMark记录。
内容的提问来源于stack exchange,提问作者fudu
相关产品推荐
相关产品推荐

