Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- SQLAlchemy的级联删除
- 我在做在线相册的时候,碰到这么一个需求,1个相册多张图片,1个图片可以被多个用户喜欢,1个用户可以喜欢多个图片。
- 相册与图片的关系是1:M
- 图片与用户的关系是N:M
- 当我想删除这个相册的时候,如果直接删除是会报错的
- sqlalchemy.orm.exc.StaleDataError: DELETE statement on table 'photo_like' expected to delete 1 row(s); Only 0 were matched.
- 这个时候需要给Photo的喜欢关系添加passive_deletes: 使得其支持关联(被动)删除,设置为True。
- 直接上案例,有 A,B,C,AB,AC五张表
- class A(base):
- tablename = "a"
- id = Column(Integer, primary_key=True)
- b = relationship('B', secondary=AB, cascade="delete, delete-orphan", single_parent=True)
- c = relationship('C', secondary=AC, cascade="delete, delete-orphan", single_parent=True)
- class B(base):
- tablename = "b"
- id = Column(Integer, primary_key=True)
- rules = relationship('A', secondary=AB, cascade="delete, delete-orphan", single_parent=True, passive_deletes=True)
- class C(base):
- tablename = "c"
- id = Column(Integer, primary_key=True)
- rules = relationship('A', secondary=AC, cascade="delete, delete-orphan", single_parent=True, passive_deletes=True)
- AB = Table(
- "AB", Base.metadata,
- Column("A_id", Integer, ForeignKey("A.id")),
- Column("B_id", Integer, ForeignKey("B.id"))
- )
- AC = Table(
- "AC", Base.metadata,
- Column("A_id", Integer, ForeignKey("A.id")),
- Column("C_id", Integer, ForeignKey("C.id"))
- )
- 关系是:
- A表对B表多对多,关系存放在AB表
- A表对C表多对多,关系存放在AC表
- 操作:
- 删除A表的数据时,同时删除B,C,AB,AC表与A相关联的数据。
- secondary:多对多关联类
- cascade:设置级联关系,删除用delete, delete-orphan
- single_parent:让级联支持多对多,设置为True
- 没有此属性会报异常:On X.x, delete-orphan cascade is not supported on a many-to-many or many-to-one relationship when single_parent is not set. Set single_parent=True on the relationship().
- passive_deletes: 支持关联(被动)删除,设置为True
- 没有此属性会报异常:DELETE statement on table 'B' expected to delete 1 row(s); Only 0 were matched.
Add Comment
Please, Sign In to add comment