文章内容
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 理解
评论列表