一、代碼級聯刪除 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"))