mysql delete 级联删除_MySQL 数据库表的 ondelete 级联删除

这篇博客详细介绍了如何在 SQLAlchemy 中实现 MySQL 数据库表的级联删除操作。通过创建 User, Course 和 Lab 三个类,展示了外键关联和级联删除的配置。在 Course 类中设置 `ondelete='CASCADE'` 和 relationship 的 `cascade='all, delete-orphan'`,当删除 User 实例时,其对应的 Course 和 Lab 实例也会被级联删除。" 104267875,7955782,Android自定义SVG地图:构建交互式中国地图,"['Android开发', 'SVG', '图形绘制', 'UI组件']
摘要由CSDN通过智能技术生成

首先,创建三个数据库表映射类 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 ''.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 ''.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 ''.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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值