文章内容
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
指示子对象在所有情况下都应跟随其父对象,并且在不再与该父对象关联后将其删除。
参考资料:
2、hibernate 级联(cascade和inverse)
3、Cascades
4、cascade='all, delete-orphan', passive_deletes=True 理解
黄兵个人博客原创。
转载请注明出处:黄兵个人博客 - SQLAlchemy 级联删除、更新
劳资到此一游 on 回复 有用(1)
haoooooo文!