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

  • 相关阅读:
    WSL 修改默认登录用户为root
    WSL ssh服务自启动
    odoo 获取model的所有字段
    C++类型父类与子类的转换--dynamic_cast(转)
    开源软件/镜像库
    C/C++编译器gcc的windows版本MinGW-w64安装教程(转)
    msys2 环境搭建
    Windows下利用Cygwin搭建C/C++开发环境GCC(转)
    模板类中子类访问父类中的成员需要通过this指针
    C++ 构造函数与this指针
  • 原文地址:https://www.cnblogs.com/ShanCe/p/15381412.html
Copyright © 2020-2023  润新知