在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参数的更多相关文章

  1. Java进阶(三十九)Java集合类的排序,查找,替换操作

    Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...

  2. Gradle 1.12用户指南翻译——第三十九章. IDEA 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  3. SQL注入之Sqli-labs系列第三十八关、第三十九关,第四十关(堆叠注入)

    0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注入更为准确.堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据 ...

  4. 第三百三十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式

    第三百三十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—Scrapy启动文件的配置—xpath表达式 我们自定义一个main.py来作为启动文件 main.py #!/usr/bin/en ...

  5. WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形

    原文:WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形 说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘> ...

  6. 微信小程序把玩(三十九)navigation API

    原文:微信小程序把玩(三十九)navigation API 演示效果也看到了小程序也就提供这几个处理导航控制.值得注意的是只能同时导航五个页面 主要属性: 导航条一些方法 wx.setNavigati ...

  7. 《手把手教你》系列技巧篇(三十九)-java+ selenium自动化测试-JavaScript的调用执行-上篇(详解教程)

    1.简介 在做web自动化时,有些情况selenium的api无法完成,需要通过第三方手段比如js来完成实现,比如去改变某些元素对象的属性或者进行一些特殊的操作,本文将来讲解怎样来调用JavaScri ...

  8. NeHe OpenGL教程 第三十九课:物理模拟

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  9. 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 ...

随机推荐

  1. json文件处理四个函数

    import json # json.dumps(json_dict,ensure_asscii = False)函数的使用,将字典转化为字符串 ensure_ascii=False将Unicode编 ...

  2. docker常用命令与容器创建

    ################docker安装##################### Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版是免费提供给个 ...

  3. zzu edu

    https://jw.v.zzu.edu.cn/eams/login.action 查询密码: 身份证后六位

  4. libcyusb

    https://github.com/hmaarrfk/libcyusb/blob/master/include/cyusb.h

  5. spring ObjectFactory

    AspectJAwareAdvisorAutoProxyCreator implements PostProcessor postProcessorAfterInitialization(Object ...

  6. plsql 连不上64位oracle客户端

    1)安装Oracle 11g 64位 2)安装32位的Oracle客户端( instantclient-basic-win32-11.2.0.1.0) 下载instantclient-basic-wi ...

  7. mybatis-plus-generator 实践

    package com.huixiaoer.ant.generator; import com.baomidou.mybatisplus.annotation.DbType; import com.b ...

  8. css动画速度与三次贝赛尔曲线

      今天要说的是css的动画曲线.   首先要说的是语法: value: 1.linear:线性动画,也就是匀速,以相同的速度开始以相同的速度结束. 2.ease:默认的动画效果,特点是先快后慢,时间 ...

  9. SQL Server中一些不常见的查询

    把一些不常见但又会用到的SQL查询整理备份一下 --筛选出某个字段中包含中文的记录 SELECT * FROM temp WHERE W1 LIKE '%[吖-座]%' --筛选出某个字段在哪些表中存 ...

  10. “不是一个有效的Win32应用程序”

    造冰箱的大熊猫@cnblogs 2018/10/23 今天在Windows计算机上安装一个应用程序时遇到“不是一个有效的Win32应用程序”错误.原以为是应用程序与操作系统版本兼容问题,或者是应用程序 ...