sqlalchemy 级联删除

一、代码级联删除 relationship

  1. all, delete-orphan

    1. 用于 one-to-many 不能用于 many-to-one or many-to-many
    • 简单说就是, 只能用在 父 表中。
    1. 级联删除,删除父数据 的时候会删除子数据
    2. 这个只能用于 代码删除, 不能直接在数据库中删除

    示例:

    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()
    
  2. all, delete

    1. 用在 父表,删除父表数据 会级联删除 子表数据

    2. 用在子表, 删除父表数据,会将子表外键数据设置为空

    3. 同样只能使用代码删除不能在数据库中直接删除

      用在子表示例:

    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 参数

  1. 代码删除父表数据, 子表数据外键会被设置为 空
  2. 数据库删除父表数据, 子表数据会被直接删除

示例:

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"))

posted @ 2021-10-08 19:13  ShanCe-刘勇  阅读(1445)  评论(0编辑  收藏  举报