文章内容

2019/9/24 11:39:54,作 者: 黄兵

SQLAlchemy 级联删除、更新

在SQLAlchemy中,如何级联删除与更新,总结了一下:

级联(Cascade) : 二个以上的设备通过某种方式连接起来,能起到扩容的效果就是级联。

SQLAlchemy级联(Cascade)是用来说明数据库中两个表之间相互关系(一对一,一对多,多对多)中,当对主对象进行某种操作时,是否对其关联的从对象也作类似的操作(比如有对象Department和Employee,它们之间是一对多的关系,当保存Department时,其对应的Employee是否也相应的保存),常见的级联(Cascade)有:

none:在保存,删除或修改当前对象时,不对其附属对象(关联对象)进行级联操作。它是默认值。

save-update:在保存,更新当前对象时,级联保存,更新附属对象(临时对象,游离对象)。

delete:在删除当前对象时,级联删除附属对象。

all:所有情况下均进行级联操作,即包含save-update和delete等等操作。

delete-orphan:删除此对象的同时删除与当前对象解除关系的孤儿对象(仅仅使用于一对多关联关系中)。

父表:

# 公共属性值
class PrivateNumberPropertyValue(db.Model):
    __tablename__ = 'private_number_property_value'
    user_shopping_carts = db.relationship('UserShoppingCart', backref='private_number_property_value',
                                          cascade='all, delete-orphan', passive_deletes=True)

子表:

# 购物车
class UserShoppingCart(db.Model):
    __tablename__ = 'user_shopping_carts'
    phone_number_section_id = db.Column(db.Integer,
                                        db.ForeignKey('private_number_property_value.id', ondelete='CASCADE'),
                                        index=True)
    phone_number_use_time_id = db.Column(db.Integer,
                                         db.ForeignKey('private_number_property_value.id', ondelete='CASCADE'),
                                         index=True)
    phone_number_amount_id = db.Column(db.Integer,
                                       db.ForeignKey('private_number_property_value.id', ondelete='CASCADE'),
                                       index=True)

relationship中设置cascade='all, delete-orphan', passive_deletes=True

ForeignKey中设置ondelete='CASCADE'

 cascade 默认值是 save-update, merge  cascade 参数的典型替代设置为 all 或者更常见 all, delete-orphan 。这个 all 符号是 save-update, merge, refresh-expire, expunge, delete ,并将其与 delete-orphan 指示子对象在所有情况下都应跟随其父对象,并且在不再与该父对象关联后将其删除。


参考资料:

1、sqlalchemy 的表关联和联级删除

2、hibernate 级联(cascade和inverse)

3、Cascades

分享到:

发表评论

评论列表

user-ico

劳资到此一游 on 回复 有用(1

haoooooo文!