3、delete级联

顾名思义,delete级联是指当父对象被从session中删除时,其关联的子对象也自动被从session中delete。通过一个例子演示delete的作用,假设数据库中class表和students表的内容如下表所示:

class表:

class_id name level address
1 三年二班 3 理想路520号1楼
2 五年一班 5 理想路520号3楼
3 五年二班 5 理想路520号3楼

student表:

student_id class_id name age gender address contactor
1 1 理想 10 静安区 Null
2 1 mark 10 静安区 Null
3 1 小马哥 9 闸口区 张三
4 2 张苗 10 宝山区 NULL
5 2 小黑 12 静安区 李四
6 2 喵喵 11 闸北区 NULL
7 1 韩永跃 10 静安区 NULL
8 3 小镜镜 12 闸北区 NULL
9 3 小镜子 12 宝山区 NULL

从例表中可知,系统中有3个班级,他们分别有4、3、2个学生。如果SQLAlchemy中没有把它们的relationship的cascade设置为delete,则删除父表内容不会删除相应的子表内容,而是把子表的相应外键设置为空。比如:

class_=session.query(Class).filter(name="三年二班").first() #三年二班的class_id为1
session.delete(class_)  #删除class_id为1的班级

当cascade不包含delete时,上述代码中的delete语句相当于执行了如下SQL语句:

UPDATE student SET class_id=None WHERE class_id=1;
DELETE FROM class WHERE class_id=1;
COMMIT;

执行后数据表class和student的内容变化如下所示:

class表:

class_id name level address
2 五年一班 5 理想路520号3楼
3 五年二班 5 理想路520号3楼

student表:

student_id class_id name age gender address contactor
1 NULL 理想 10 静安区 Null
2 NULL mark 10 静安区 Null
3 NULL 小马哥 9 闸口区 张三
4 2 张苗 10 宝山区 NULL
5 2 小黑 12 静安区 李四
6 2 喵喵 11 闸北区 NULL
7 1 韩永跃 10 静安区 NULL
8 3 小镜镜 12 闸北区 NULL
9 3 小镜子 12 宝山区 NULL

此时将表定义中的relationship的cascade属性设置为delete:

students=relationship("Student",backref="class",cascade="delete")

现在通过如下语句删除“五年一班”:

class_=session.query(Class).filter(name="五年一班").first()  #五年一班的class_id为2
session.delete(class_)          #删除class_id为2的班级

当cascade包含“delete”时,上述代码中的delete语句相当于执行了如下SQL语句:

DELETE FROM student WHERE class=2;
DELETE FROM class WHERE class=2;
COMMIT;

执行后数据库表class和student的内容变化如下表所示:

class表:

class_id name level address
3 五年二班 5 理想路520号3楼

student表:

student_id class_id name age gender address contactor
1 NULL 理想 10 静安区 Null
2 NULL mark 10 静安区 Null
3 NULL 小马哥 9 闸口区 张三
7 NULL 韩永跃 10 静安区 NULL
8 3 小镜镜 12 闸北区 NULL
9 3 小镜子 12 宝山区 NULL

results matching ""

    No results matching ""