文章内容

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 为删除,在刷新操作进行后, address1address2 也会被被删除。

当然我们上面的模型定义是错误的,当删除资金流水的时候,状态代码不应该被删除。


参考资料:

1、SQLAlchemy 级联删除、更新

2、passive_deletes=False


黄兵个人博客原创。

转载请注明出处:黄兵个人博客 - cascade='all, delete-orphan', passive_deletes=True 理解

分享到:

发表评论

评论列表