文章内容
2023/3/10 16:20:08,作 者: 黄兵
cascade='all, delete-orphan', passive_deletes=True 理解
今天在模型中有这样的模型定义:
# 账户资金记录(消费、充值、续费等) class CloudProductAccountFunds(db.Model): __tablename__ = 'cloud_product_account_funds' __table_args__ = {'comment': '账户资金流水,包括:充值、续费、消费等'} id = db.Column(db.Integer, primary_key=True) status_id=db.Column(db.Integer,db.ForeignKey('cloud_product_account_funds_status.id'),commnet='支付是否完成,支付订单是否创建,扣款是否完成')
status 定义如下:
# 账户资金状态(创建支付、支付完成、扣款完成) class CloudProductAccountFundsStatus(db.Model): __tablename__ = 'cloud_product_account_funds_status' id = db.Column(db.Integer, primary_key=True) status = db.Column(db.String(16)) code = db.Column(db.String(16)) account_funds = db.relationship('CloudProductAccountFunds', backref="cloud_product_account_funds_status", lazy="dynamic", cascade='all, delete-orphan', passive_deletes=True)
这里的:cascade='all, delete-orphan', passive_deletes=True
是一个级联删除操作,级联 delete
表示当一个“父”对象被标记为删除时,其相关的“子”对象也应该被标记为删除。
passive_deletes=True 支持关联(被动)删除。
例如官方举了如下的一个例子:
class User(Base): # ... addresses = relationship("Address", cascade="all, delete")
如果使用上面的映射,我们有一个 User
对象和两个相关的 Address
对象:
user1 = sess1.scalars(select(User).filter_by(id=1)).first() address1, address2 = user1.addresses
如果我们标记 user1
为删除,在刷新操作进行后, address1
和 address2
也会被被删除。
当然我们上面的模型定义是错误的,当删除资金流水的时候,状态代码不应该被删除。
参考资料:
黄兵个人博客原创。
转载请注明出处:黄兵个人博客 - cascade='all, delete-orphan', passive_deletes=True 理解
评论列表