三十九:数据库之SQLAlchemy.relationship方法中的cascade参数
在SQLAlchemy中,只要将一条数据添加到session中,其它和此条数据相关联的数据都会一起存到数据库中,这是因为在relationship中有一个关键字参数:cascade,默认选项为save-update
一:save-update:默认选项,在添加一条数据的时候,会把其他和次数据关联的数据都添加到数据库中,这种行为就是save-update属性决定的
二:delete:表示当删除某一个模型中的数据的时候,也删除掉使用relationship和此数据关联的数据
三:delete-orphan:表示当对一个ORM对象解除了父表中的关联对象的时候,自己便会被删除,如果父表的数据被删除,同样自己也会被删除,这个选项只能用在一对多上,不能用在多对多和多对一上,并且使用的时候还需要在子模型的relationship中增加参数:single_parent=True
四:merge(合并):默认选项,当在使用session.merge合并一个对象的时候,会将使用了relationship相关联的对象也进行merge操作
五:expunge:移除操作的时候,会将相关联的对象也进行移除,这个操作只是从session中移除,并不会正则从数据库删除
六:all:对 save-update、merge、refresh-expire、expunge、delete 这几种的缩写
准备工作
from sqlalchemy import create_engine, Column, Integer, String, Float, Text, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship, backref # 数据库信息
host = '127.0.0.1'
port = '3306'
database = 'db_to_sqlalchemy'
username = 'root'
password = '123456' # 数据库类型+连接数据库的插件,这里使用的pymysql
DB_URI = f'mysql+pymysql://{username}:{password}@{host}:{port}/{database}' engine = create_engine(DB_URI) # 创建引擎
Base = declarative_base(engine) # 使用declarative_base创建基类
session = sessionmaker(engine)()
使用默认的cascade的值(不指定值),关系映射成功
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(50), nullable=False) class Article(Base):
__tablename__ = 'article'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(50), nullable=False)
uid = Column(Integer, ForeignKey('user.id'))
author = relationship('User', backref='article') Base.metadata.drop_all() # 删除所有表
Base.metadata.create_all() # 创建表 user = User(username='aaa')
article = Article(title='title1')
article.author = user session.add(article)
session.commit()
一:save-update:默认选项,在添加一条数据的时候,会把其他和次数据关联的数据都添加到数据库中,这种行为就是save-update属性决定的
将cascade的值设为空,则不会将模型关系映射成功
再看数据库
手动设置为:save-update,关系映射成功
二:delete:表示当删除某一个模型中的数据的时候,也删除掉使用relationship和此数据关联的数据
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(50), nullable=False) class Article(Base):
__tablename__ = 'article'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(50), nullable=False)
uid = Column(Integer, ForeignKey('user.id'))
author = relationship('User', backref='article', cascade='save-update,delete') Base.metadata.drop_all() # 删除所有表
Base.metadata.create_all() # 创建表 user = User(username='aaa')
article = Article(title='title1')
article.author = user
session.add(article)
session.commit()
删除article,此时对应的user信息也会被删除
article = session.query(Article).first()
session.delete(article)
session.commit()
同理,也可以在user表下做同样设置
三:delete-orphan:表示当对一个ORM对象解除了父表中的关联对象的时候,自己便会被删除,如果父表的数据被删除,同样自己也会被删除,这个选项只能用在一对多上,不能用在多对多和多对一上,并且使用的时候还需要在子模型的relationship中增加参数:single_parent=True,前提relationship的cascade需有delete属性
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(50), nullable=False) class Article(Base):
__tablename__ = 'article'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(50), nullable=False)
uid = Column(Integer, ForeignKey('user.id'))
author = relationship('User', backref=backref('Article', cascade='save-update,delete,delete-orphan'),
cascade='save-update,delete', single_parent=True) Base.metadata.drop_all() # 删除所有表
Base.metadata.create_all() # 创建表 user = User(username='aaa')
article = Article(title='title1')
article.author = user
session.add(article)
session.commit()
将user下的article置为空,则article表中的数据会为空,由于设置了delete-orphan属性,为空的数据会被删除
四:merge(合并):默认选项,当在使用session.merge合并一个对象的时候,会将使用了relationship相关联的对象也进行merge操作
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(50), nullable=False) class Article(Base):
__tablename__ = 'article'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(50), nullable=False)
uid = Column(Integer, ForeignKey('user.id'))
author = relationship('User', backref=backref('article', cascade='save-update,delete,delete-orphan'),
cascade='save-update,delete', single_parent=True) Base.metadata.drop_all() # 删除所有表
Base.metadata.create_all() # 创建表 user = User(username='aaa')
article = Article(title='title1')
article.author = user
session.add(article)
session.commit()
在模型关系中使用
五:expunge:移除操作的时候,会将相关联的对象也进行移除,这个操作只是从session中移除,并不会正则从数据库删除,与session.add
六:all:对 save-update、merge、refresh-expire、expunge、delete 这几种的缩写
三十九:数据库之SQLAlchemy.relationship方法中的cascade参数的更多相关文章
- Java进阶(三十九)Java集合类的排序,查找,替换操作
Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...
- Gradle 1.12用户指南翻译——第三十九章. IDEA 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- SQL注入之Sqli-labs系列第三十八关、第三十九关,第四十关(堆叠注入)
0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注入更为准确.堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据 ...
- 第三百三十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式
第三百三十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式 我们自定义一个main.py来作为启动文件 main.py #!/usr/bin/en ...
- WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形
原文:WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形 说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘> ...
- 微信小程序把玩(三十九)navigation API
原文:微信小程序把玩(三十九)navigation API 演示效果也看到了小程序也就提供这几个处理导航控制.值得注意的是只能同时导航五个页面 主要属性: 导航条一些方法 wx.setNavigati ...
- 《手把手教你》系列技巧篇(三十九)-java+ selenium自动化测试-JavaScript的调用执行-上篇(详解教程)
1.简介 在做web自动化时,有些情况selenium的api无法完成,需要通过第三方手段比如js来完成实现,比如去改变某些元素对象的属性或者进行一些特殊的操作,本文将来讲解怎样来调用JavaScri ...
- NeHe OpenGL教程 第三十九课:物理模拟
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- centos shell编程5 LANMP一键安装脚本 lamp sed lnmp 变量和字符串比较不能用-eq cat > /usr/local/apache2/htdocs/index.php <<EOF重定向 shell的变量和函数命名不能有横杠 平台可以用arch命令,获取是i686还是x86_64 curl 下载 第三十九节课
centos shell编程5 LANMP一键安装脚本 lamp sed lnmp 变量和字符串比较不能用-eq cat > /usr/local/apache2/htdocs/ind ...
随机推荐
- 常用数据存储格式之xml
常用数据存储格式介绍 XML 被设计用来传输和存储数据,其焦点是数据的内容. HTML 被设计用来显示数据,其焦点是数据的外观. 语法规则: XML 文档必须有一个根元素 XML元素都必须有一个关闭标 ...
- Dubbo 04 服务化最佳实现流程
Dubbo 04 服务化最佳实践 分包 建议将服务接口.服务模型.服务异常等均放在 API 包中,因为服务模型和异常也是 API 的一部分,这样做也符合分包原则:重用发布等价原则(REP),共同重用原 ...
- oracle的监听控制
来自网络: listener control 监听控制 因为你在键入 lsnrctl 回车之后,就进入到监听控制界面. 在启动.关闭或者重启oracle监听器之前确保使用lsnrctl status命 ...
- 【CF208E】Blood Cousins
题目大意:给定一个 N 个点的森林,M 个询问,每次询问对于点 u 来说,有多少个点和 u 有相同的 K 级祖先. 题解:线段树合并适合处理子树贡献的问题. 发现要回答这个询问在点 u 处计算很困难, ...
- repo 回退当前分支下所有仓库到指定日期前的最新代码版本
回退命令: repo forall -c 'commitID=git log --before "2019-11-24 23:59" -1 --pretty=format:&quo ...
- 【51nod 2026】Gcd and Lcm
题目 已知 \(f(x)=\sum_{d|x}μ(d)∗d\) 现在请求出下面式子的值 \(\sum_{i=1}^{n}\sum_{j=1}^{n}f(gcd(i,j))∗f(lcm(i,j))\) ...
- [大数据] hadoop高可用(HA)部署(未完)
一.HA部署架构 如上图所示,我们可以将其分为三个部分: 1.NN和DN组成Hadoop业务组件.浅绿色部分. 2.中间深蓝色部分,为Journal Node,其为一个集群,用于提供高可用的共享文件存 ...
- 计算机网络(五),TCP四次挥手
目录 1.TCP四次挥手详情 2.为什么会有TIME-WAIT状态 3.为什么需要四次握手才能断开连接 4.服务器出现大量CLOSE_WAIT的原因 五.TCP四次挥手 1.TCP四次挥手详情 (1) ...
- SpringBoot项目中,异常拦截
SpringBoot自带异常拦截@ControllerAdvice 1.创建一个SellerExceptionHandler类打上@ControllerAdvice标签 @ControllerAdvi ...
- java实现大文件上传
文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用 ...