sqlalchemy 级联删除
一、代码级联删除 relationship
-
all, delete-orphan
- 用于 one-to-many 不能用于 many-to-one or many-to-many
- 简单说就是, 只能用在 父 表中。
- 级联删除,删除父数据 的时候会删除子数据
- 这个只能用于 代码删除, 不能直接在数据库中删除
示例:
class Parent(db.Model): __tablename__ = "parent" id = db.Column(db.Integer, primary_key = True) child = db.relationship('Child', cascade='all, delete-orphan') class Child(db.Model): __tablename__ = "child" id = db.Column(db.Integer, primary_key = True) parentid = db.Column(db.Integer, db.ForeignKey(Parent.id)) ### 代码删除 p = Parent.query.first() db.session.delete(p) db.session.commit()
-
all, delete
-
用在 父表,删除父表数据 会级联删除 子表数据
-
用在子表, 删除父表数据,会将子表外键数据设置为空
-
同样只能使用代码删除不能在数据库中直接删除
用在子表示例:
class Parent(db.Model): __tablename__ = "parent" id = db.Column(db.Integer, primary_key=True) class Child(db.Model): __tablename__ = "child" id = db.Column(db.Integer, primary_key=True) parentid = db.Column(db.Integer, db.ForeignKey(Parent.id)) parent = db.relationship(Parent, cascade="all,delete", backref="children") # # db.drop_all() # db.create_all() p = Parent.query.first() db.session.delete(p) db.session.commit()
-
二、数据库级联删除 ForeignKey , 参数
1.1 db.ForeignKey 中, ondelete 参数
- 代码删除父表数据, 子表数据外键会被设置为 空
- 数据库删除父表数据, 子表数据会被直接删除
示例:
class Parent(db.Model):
__tablename__ = "parent"
id = db.Column(db.Integer, primary_key=True)
class Child(db.Model):
__tablename__ = "child"
id = db.Column(db.Integer, primary_key=True)
parentid = db.Column(db.Integer, db.ForeignKey(Parent.id, ondelete='cascade'))
parent = db.relationship(Parent, backref="children")
1.2 配合 relationship 的 passive_deletes 字段, 实现 代码删除子数据
注意: relationship 写在 子表中没有用。
class Parent(db.Model):
__tablename__ = "parent"
id = db.Column(db.Integer, primary_key=True)
child = db.relationship('Child', backref="parent", passive_deletes=True)
class Child(db.Model):
__tablename__ = "child"
id = db.Column(db.Integer, primary_key=True)
parentid = db.Column(db.Integer, db.ForeignKey(Parent.id, ondelete='cascade'))
1.3 使用 backref() 函数, 代码删除子数据
class Parent(db.Model):
__tablename__ = "parent"
id = db.Column(db.Integer, primary_key=True)
class Child(db.Model):
__tablename__ = "child"
id = db.Column(db.Integer, primary_key=True)
parentid = db.Column(db.Integer, db.ForeignKey(Parent.id, ondelete='cascade'))
parent = db.relationship(Parent, backref=db.backref("children", cascade="all, delete"))