SQLAlchemy关联表删除策略设置

目录

SQLAlchemy关联表

常用的级联选项

外键


SQLAlchemy关联表

SQLAlchemy 是一个 Python 的 ORM(对象关系映射)库,它允许你在 Python 中使用类来表示数据库中的表,从而更方便地进行数据库操作。在 SQLAlchemy 中,可以使用关联表(relationship)来定义两个表之间的关系,包括一对一、一对多和多对多等关系。

在定义关联表的时候,你可以设置 cascade 参数来指定在删除记录时的级联行为。

常用的级联选项

  1. all:删除主记录时,从属记录也会被删除。
  2. save-update:当主记录发生变化时,从属记录会自动保存。
  3. delete-orphan:删除主记录时,从属记录也会被删除,如果从属记录变成了孤儿(没有任何主记录与之关联),也会被删除。

以下是一个简单的例子,演示了如何在 SQLAlchemy 中设置关联表的删除策略:

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationshipBase = declarative_base()class Parent(Base):__tablename__ = 'parents'id = Column(Integer, primary_key=True)name = Column(String)children = relationship('Child', back_populates='parent', cascade='all, delete-orphan')class Child(Base):__tablename__ = 'children'id = Column(Integer, primary_key=True)name = Column(String)parent_id = Column(Integer, ForeignKey('parents.id'))parent = relationship('Parent', back_populates='children')# 创建数据库连接
engine = create_engine('sqlite:///example.db')# 创建表格
Base.metadata.create_all(engine)

 

  • Parent 表中有一个名为 children 的关联关系,它关联到了 Child 类,通过 back_populates 参数指定了反向关系的属性名为 parent,并且设置了级联删除策略为 all, delete-orphan,这表示在删除父记录时,会级联删除子记录,并且也会删除变成孤儿的子记录。

  • Child 表中有一个名为 parent 的关联关系,它关联到了 Parent 类,通过 back_populates 参数指定了反向关系的属性名为 children

创建了一个 SQLite 数据库连接,并使用 Base.metadata.create_all(engine) 来创建表格。

 

外键

使用SQLAlchemy创建外键非常简单。在从表中增加一个字段,指定这个字段外键的是哪个表的哪个字段就可以了。从表中外键的字段,必须和主表的主键字段类型保持一致。

class User(Base):__tablename__ = 't_user'id = Column(Integer,primary_key=True,autoincrement=True)uname = Column(String(50),nullable=False,name='name')class News(Base):__tablename__ = 't_news'id = Column(Integer,primary_key=True,autoincrement=True)title = Column(String(50),nullable=False)content = Column(Text,nullable=False)uid = Column(Integer,ForeignKey('t_user.id',)

外键约束有以下几项:

  • RESTRICT:若子表中有父表对应的关联数据,删除父表对应数据,会阻止删除。默认项

  • NO ACTION:在MySQL中,同RESTRICT。

  • CASCADE:级联删除。

  • SET NULL:父表对应数据被删除,子表对应数据项会设置为NULL。

 

from sqlalchemy import Column,Integer,String,Text,ForeignKeyfrom db_util import Base,Sessionclass User(Base):__tablename__ = 't_user'id = Column(Integer,primary_key=True,autoincrement=True)uname = Column(String(50),nullable=False,name='name')class News(Base):__tablename__ = 't_news'id = Column(Integer,primary_key=True,autoincrement=True)title = Column(String(50),nullable=False)content = Column(Text,nullable=False)# uid = Column(Integer,ForeignKey('t_user.id'))  # 默认不让删主表数据# uid = Column(Integer,ForeignKey('t_user.id',ondelete = 'RESTRICT')) # 默认的策略# uid = Column(Integer,ForeignKey('t_user.id',ondelete = 'NO ACTION')) # 默认的策略# uid = Column(Integer,ForeignKey('t_user.id',ondelete = 'CASCADE')) # 级联删除,发主表的数据被删除,子表的里数据也会删除uid = Column(Integer,ForeignKey('t_user.id',ondelete = 'SET NULL')) # 发现主表数据被删除时,子表的数据列会清空def create_data():user = User(uname = 'sxt') news1 = News(title='python',content='flask',uid = 1)news2 = News(title='MySQL',content='SQL',uid = 1)with Session() as ses:ses.add(user)ses.commit()with Session() as ses:ses.add(news1)ses.add(news2)ses.commit()if __name__ == '__main__':Base.metadata.create_all()create_data()

News 表中,使用了外键 uid 关联到了 t_user.id,并设置了删除策略为 SET NULL,这表示当 t_user 表中的对应记录被删除时,会将 News 表中对应的外键字段(即 uid)设为 NULL

提供了一个 create_data 函数来创建用户和新闻的示例数据,并在 __main__ 中调用了该函数。

create_data 函数中,首先创建了一个用户(uname 为 'sxt'),然后创建了两条新闻记录,并分别将 uid 设置为 1,表示这两条新闻属于用户 1。

然后你通过 Session 来提交了这些数据。

最后,在 __main__ 中调用了 Base.metadata.create_all() 来创建数据库表结构,然后调用了 create_data() 函数来插入示例数据。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/88594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea没有maven工具栏解决方法

背景:接手的一些旧项目,有pom文件,但是用idea打开的时候,没有认为是maven文件,所以没有maven工具栏,不能进行重新加载pom文件中的依赖。 解决方法:选中pom.xml文件,右键 选择添加为…

【CloudComapre】Ubuntu 20.04 下从源码编译后无法导入pcd文件

文章目录 原因解决方法 原因 我直接执行build/qCC/CloudCompare,是无法导入pcd文件的,会弹窗提示: [Load] Cant guess file format: unhandled file extension XXX这是由于没有安装软件,也就是说我们二次开发时必须要安装到系统…

【lesson11】环境变量

文章目录 环境变量的认识main函数参数问题 环境变量的认识 我们知道我们运行自己写的可执行程序的时候,我们必须带路径才能运行,可是执行系统指令的时候不用路径就能运行。 演示: 问题:系统命令可以直接运行,自己写…

作为一名独立开发者,如何获取客户?

很多程序员想成为一名独立开发者,从事自由职业,最大的困难在于如何赚钱,进一步来说,就是如何找到自己的客户,有很多开发者拥有丰富的经验,优秀的能力,但无法吸引客户。这篇文章的灵感正是为此而…

[密码学入门]仿射密码(Affine)

加密算法y(axb)mod N 解密算法x*(y-b)mod N(此处的为a关于N的乘法逆元,不是幂的概念) 如何求,涉及的知识挺多,还没想好怎么写,丢番图方程,贝祖定理(又译裴蜀定理),扩展欧…

【kafka实战】01 3分钟在Linux上安装kafka

本节采用docker安装Kafka。采用的是bitnami的镜像。Bitnami是一个提供各种流行应用的Docker镜像和软件包的公司。采用docker的方式3分钟就可以把我们想安装的程序运行起来,不得不说真的很方便啊,好了,开搞。使用前提:Linux虚拟机&…

使用Python接口自动化测试post请求和get请求,获取请求返回值

引言 我们在做python接口自动化测试时,接口的请求方法有get,post等;get和post请求传参,和获取接口响应数据的方法; 请求接口为Post时,传参方法 我们在使用python中requests库做接口测试时,在做post接口测试…

软件安全测试详细总结

摘要 安全性测试从冷门的话题,随着国内各大知名网站频繁被攻击,重要社区用户信息被泄露,逐步被各方所重视。而具体怎么做软件安全性测试,防止骇客有机可乘,国内普遍处于才起步的状态。今天笔者就自己的经验&#xff0…

大咖共探AGI时代机遇,腾讯云助力大模型规模化应用提速

引言 2023 年,科技圈的“顶流”莫过于大模型。自 ChatGPT 的问世拉开大模型与生成式 AI 产业的发展序幕后,国内大模型快速跟进,已完成从技术到产品、再到商业的阶段跨越,并深入垂直行业领域。 新技术的爆发,催生新的应…

网络安全内网渗透之DNS隧道实验--dnscat2直连模式

目录 一、DNS隧道攻击原理 二、DNS隧道工具 (一)安装dnscat2服务端 (二)启动服务器端 (三)在目标机器上安装客户端 (四)反弹shell 一、DNS隧道攻击原理 在进行DNS查询时&#x…

【Linux is not Unix】Linux前言

目录 二战军工的产物——第一台现代电子数字计算机ENIAC(埃尼阿克) Unix Linux Linux企业应用现状 如今计算机已经应用在我们生活的各个层面,像我们日常使用的笔记本是计算机的一类,可以解决我们生活中遇到的很多问题&#xff…

竞赛 基于视觉的身份证识别系统

0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于机器视觉的身份证识别系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-sen…

根据文章段落内容自动插入图片php版

每篇内容根据段落判断插入图片代码附上&#xff1a; $chatd"<table>";if(stripos($content,$chatd)0){//随机输出三张图功能if($moduleid!37 &&$thumb){//判断是否存在图$idrand(1,999999);$midrand(1,9999999);$getimg"http://www.nongpin88.co…

c语言练习66:模拟实现offsetof

模拟实现offsetof #define offsetof(StructType, MemberName) (size_t)&(((StructType *)0)->MemberName) StructType是结构体类型名&#xff0c;MemberName是成员名。具体操作方法是&#xff1a; 1、先将0转换为一个结构体类型的指针&#xff0c;相当于某个结构体的首…

【Unity】LODGroup 计算公式

Unity 在配置 LodGroup 时&#xff0c;其分级切换的计算方法是按照物体在相机视野中占据的比例计算的。在运行时&#xff0c;如果相机视野范围&#xff08;Field of View&#xff09;没有改变&#xff0c;那么这个值可以直接换算成物体距离相机的距离。这里就讨论下如何计算得到…

线性表(1)

线性表即“把所有数据按照顺序&#xff08;线性&#xff09;的存储结构方式&#xff0c;存储在物理空间”。 线性表又分为 顺序表链表 单向链表双向链表 一、顺序表 数据依次存储在连续的物理空间中&#xff0c;就比如数组。 顺序表存储数据时&#xff0c;会提前申请一整块足够…

树莓派上使用kettle将文本文档导入mariadb

目录 1 连接MariaDB的前置条件 2 test.txt 3 在mariadb中创建数据库和数据表 4 在kettle中的操作 4.1 新建任务 4.2 连接数据库 4.3 文本文件输入 4.4 表输出 4.5 运行 4.6 结果 1 连接MariaDB的前置条件 首先你的mariaDB要有密码&#xff0c;我当前的用…

MQ - 32 基础功能:消息查询的设计

文章目录 导图概述什么时候会用到消息查询消息队列支持查询的理论基础消息数据存储结构关于索引的一些知识点内核支持简单查询根据 Offset 查询数据根据时间戳查询数据根据消息 ID 查询数据借助第三方工具实现复杂查询第三方引擎支持查询工具化简单查询总结导图 概述 从功能上…

智慧农业系统源码 智慧农业小程序源码

智慧农业系统源码 智慧农业小程序源码 一&#xff1a;智慧农业功能 1、有效改善农业生态环境 将农田、畜牧养殖场、水产养殖基地等生产单位和周边的生态环境视为整体,并通过对其物质交换和能量循环关系进行系 统、精密运算,保障农业生产的生态环境在可承受范围内,如定量施肥不…

【前端】零基础快速搞定JavaScript核心知识点

文章目录 1.初识JavaScript1.1.JavaScript语言简介1.2.JavaScript引入方式和注释1.3.Javascript变量声明详解1.4.JavaScript变量提升详解 2.JavaScript基础数据类型2.1.JavaScript基础数据类型简介2.2.基础类型数据-Number2.3.基础类型数据-String2.4.基础类型数据-Boolean2.5.…