美文网首页我爱编程
MySQL 数据库表的 ondelete 级联删除

MySQL 数据库表的 ondelete 级联删除

作者: Manchangdx | 来源:发表于2018-05-25 14:05 被阅读0次

首先,创建三个数据库表映射类 User 、Course、Lab
外键关联不用说,两个一对多的关系,ForeignKey 都是一样的,
注意 Course 类和 Lab 类中 relationship 的区别:

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker, backref
engine = create_engine('mysql://root@localhost/shiyanlou?charset=utf8')
Base = declarative_base(engine)
session = sessionmaker(engine)()
class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    name = Column(String(64))
    email = Column(String(64))
    def __repr__(self):
        return '<User: {}>'.format(self.name)
class Course(Base):
    __tablename__ = 'course'
    id = Column(Integer, primary_key=True)
    name = Column(String(64))
    user_id = Column(Integer, ForeignKey('user.id', ondelete='CASCADE'))
    user = relationship('User', 
           backref=backref('course', cascade='all, delete-orphan'))
    def __repr__(self):
        return '<Course: {}>'.format(self.name)
class Lab(Base):
    __tablename__ = 'lab'
    id = Column(Integer, primary_key=True)
    name = Column(String(64))
    course_id = Column(Integer, 
                ForeignKey('course.id', ondelete='CASCADE'))
    course = relationship('Course', backref='lab')
    def __repr__(self):
        return '<Lab: {}>'.format(self.name)
Base.metadata.create_all()

创建几个实例并传入数据库:

u = User(name='Kobe', email='kobe@qq.com')
c = Course(name='Flask 基础', user=u)
l = Lab(name='简单的 CRUD 操作', course=c)
session.add(u)
session.add(c)
session.add(l)
session.commit()

此时数据库的状态:

mysql> use shiyanlou
Database changed
mysql> select * from user;
+----+------+-------------+
| id | name | email       |
+----+------+-------------+
|  1 | Kobe | kobe@qq.com |
+----+------+-------------+
1 row in set (0.00 sec)

mysql> select * from course;
+----+--------------+---------+
| id | name         | user_id |
+----+--------------+---------+
|  1 | Flask 基础   |       1 |
+----+--------------+---------+
1 row in set (0.00 sec)

mysql> select * from lab;
+----+-----------------------+-----------+
| id | name                  | course_id |
+----+-----------------------+-----------+
|  1 | 简单的 CRUD 操作       |         1 |
+----+-----------------------+-----------+
1 row in set (0.00 sec)

删除 User 的实例 u :

session.delete(u)
session.commit()

此时数据库状态,u 和 c 都没了,l 还在
也就是说,只在 ForeignKey 里设置 ondelete='CASCADE' 不行
还得在 relationship 里设置 cascade='all, delete-orphan' 才能实现级联删除:

mysql> select * from user;
Empty set (0.00 sec)

mysql> select * from course;
Empty set (0.00 sec)

mysql> select * from lab;
+----+-----------------------+-----------+
| id | name                  | course_id |
+----+-----------------------+-----------+
|  1 | 简单的 CRUD 操作       |      NULL |
+----+-----------------------+-----------+
1 row in set (0.00 sec)

相关文章

  • MySQL 数据库表的 ondelete 级联删除

    首先,创建三个数据库表映射类 User 、Course、Lab外键关联不用说,两个一对多的关系,ForeignKe...

  • Mysql学习——数据库基础操作(1)

    Mysql创建数据库Mysql删除数据库Mysql创建表Mysql删除表Mysql添加表数据Mysql修改表数据M...

  • mysql学习笔记

    数据库和表 进入mysql:mysql -uroot -p 查看数据库:show databases; 删除数据库...

  • MySQL

    创建数据库 使用数据库 直接删除数据库 建表 删除整表 显示表 表的详细描述 显示当前mysql版本、当前日期、用...

  • MySQL 锁表

    Linux System Environment MySQL锁表简介 MySQL锁表是禁止用户在数据库增加/删除/...

  • SQL从入门到不放弃(ing)

    常用表操作 显示数据库下的表: 显示表列: 修改表名: 删除表: 删除mysql表中所有内容: 修改表列类型 修改...

  • 从0到1学习网络安全 【MySQL基础-MySQL 创建数据库】

    MySQL 创建数据库 数据库存有一个或多个表。 你需要 CREATE 权限来创建或删除 MySQL 数据库。 使...

  • kettle学习笔记(五)——kettle输出步骤

    一、概述 数据库表:• 表输出• 更新,删除,插入/更新• 批量加载(mysql,oracle)• 数据同步文件:...

  • JAVA WEB开发笔记

    级联删除(ON DELETE CASCADEurl: jdbc:mysql://localhost:3306/my...

  • 数据库笔记

    最基本数据库MYSQL常识: 数据库的操作主要包括 数据库的操作,包括创建、删除 表的操作,包括创建、修改、删除 ...

网友评论

    本文标题:MySQL 数据库表的 ondelete 级联删除

    本文链接:https://www.haomeiwen.com/subject/ulayjftx.html