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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM