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.rhkb.cn/news/142264.html

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

相关文章

肖sir__mysql之综合题练习__013

数据库题(10*5) 下面是一个学生与课程的数据库,三个关系表为: 学生表S(Sid,SNAME,AGE,SEX) 成绩表SC(Sid,Cid,GRADE) 课程表C(Cid&…

vue项目 H5 动态设置浏览器标题

1,先将要展示的标题存本地 if (that.PromotionInfo.Title) {localStorage.setItem("AcTitle", that.PromotionInfo.Title)} 2,现在路由meta中设置标题,再在路由守卫中设置 import Vue from vue import Router from vue-router import prom…

Sui资助申请指南,310万美元资助金已成功申领

Sui基金会致力于资助开发者、构建者、教育工作者、研究人员以及其他推动和推广Sui生态发展的社区成员。立即申请:https://airtable.com/shrkLWBRNPL89f0SX 资助计划类型 构建者资助计划 通过推动Sui的全球采用,帮助引导下一个十亿用户进入Web3的项目。…

vue实现移动端悬浮可拖拽按钮

需求: 按钮在页面侧边悬浮显示;点击按钮可展开多个快捷方式按钮,从下向上展开。长按按钮,则允许拖拽来改变按钮位置,按钮为非展开状态;按钮移动结束,手指松开,计算距离左右两侧距离…

DKD蒸馏复现

知识蒸馏主要分两类: 1:基于logits 2:基于feature logits蒸馏主要是在早期,后期效果逐步被基于feature蒸馏超越。 cvpr2022的DKD基于传统的KD进行改进,重铸logits蒸馏的荣光。目前很多蒸馏都采用DKD方案&#xff0…

云原生Kubernetes:K8S安全机制

目录 一、理论 1.K8S安全机制 2.Authentication认证 3.Authorization授权 4.Admission Control准入控制 5.User访问案例 6.ServiceAccount访问案例 二、实验 1.Admission Control准入控制 2.User访问案例 3.ServiceAccount访问案例 三、问题 1.生成资源报错 2.镜…

CSS之伪类和伪元素 | :before和::before

例子: & 表示嵌套的上一级。如 &:hover 相当于 上一级元素:hover :hover 伪类 :before 伪元素,在元素之前加入某内容(一定要写 content ) display:none; 隐藏对象。display隐藏元素后,不占原先位置…

NSSSCTF做题(2)

1.[BJDCTF 2020]easy_md5 打开页面发现没什么东西,只有一个提交表单,然后url会显示你提交的信息 源代码里也看不到什么 ,用dirsearch扫一下,这些是扫出来的数据 抓包看到了提示 hint: select * from admin where passwordmd5($pas…

新手必看:Android studio 侧边栏实现,带源码

文章目录 前言效果图正文toolbar 用于定义应用程序的导航栏app_bardrawer_layout 用于创建侧边栏导航nav_header_draw app:menu"menu/activity_main_drawer" 前言 本篇内容主要是自己实现侧边栏后的一些总结,部分理论来着网络和ai助手,如有错…

一台电脑远程内网的另外一台电脑,禁止远程的电脑连接外网,只允许内网连接

一台电脑远程内网的另外一台电脑,禁止远程的电脑连接外网,只允许内网连接 1.找到右下角网卡图标,右键图标选择“打开网络和共享中心”。 3、点击“更改适配器设置”。 4、右键正在使用的网卡“本地连接”打开属性 5、找到“internet协…

DAZ To UMA⭐三.导入Blender的配置, 及Blender快捷键

文章目录 🟥 Blender快捷键1️⃣ 3D视图快捷键2️⃣ 视角快捷键3️⃣ 编辑快捷键4️⃣ 对物体的操作🟧 Blender导入FBX的配置🟩 设置脸部骨骼大小1️⃣ 切换视角2️⃣ 缩小脸部骨骼3️⃣ 本节效果预览🟦 设置眼角膜透明度🟥 Blender快捷键 1️⃣ 3D视图快捷键 快捷键…

UML基础与应用之面向对象

UML(Unified Modeling Language)是一种用于软件系统建模的标准化语言,它使用图形符号和文本来描述软件系统的结构、行为和交互。在面向对象编程中,UML被广泛应用于软件系统的设计和分析阶段。本文将总结UML基础与应用之面向对象的…

UG NX二次开发(C#)-计算直线到各个坐标系轴向的投影角度

文章目录 1、前言2、需求分析3、NXOpen方法实现3.1 创建基准坐标系3.2 然后计算直线到基准坐标系的轴向角度3.3 代码调用4、测试效果为:1、前言 最近有个粉丝问我如何计算直线到坐标系各个轴向的角度,这里用UG NX二次开发(C#)实现。当然,这里的内容是经验之谈,如果有更好的…

2、AWT介绍

2、AWT介绍 AWT是Swing的前身,我们使用AWT学习底层的实现而用Swing来画一些界面 2.1 AWT 介绍 AWT:抽象的窗口工具(Abstract Windows Tools),包含了很多的类和接口!用于GUI编程,GUI&#xff…

秦时明月沧海手游阵容推荐,秦时明月沧海角色强度

秦时明月沧海角色强度如何?在秦时明月沧海手游中,您可以从大量的角色卡牌中选择并发展,为了顺利通过各种副本,玩家们需要精心搭配阵容。那么,具体该如何配置最强的角色呢? 下面,小编将带各位玩家…

GeoServer运行报错503,……Unmapped relationship: 7

Windows11运行GeoServer-2.19.0报错[org.geoserver.system.status.OSHISystemInfoCollector]……Unmapped relationship: 7 问题说明解决方法 问题说明 最近换了新电脑,在电脑上安装了一个geoserver2.19.0版本,但是运行就是报错,虽然最后提示…

SVN_SERVER的搭建

一、目前svnserver仅支持windows下安装,所以前提需要一台windows服务器或者windows主机 1. 下载最新版本的包 当前最新版visualsvn server最新版5.3.0 visualsvn server下载地址Downloads | VisualSVN 当前tortoiseSVn最新版1.14.5 tortoise SVN下载地址 h…

高等数学应试考点速览(下)

函数项级数 【收敛域】上,收敛于:【和函数】; 幂级数:绝对收敛区间 ( − R , R ) (-R,R) (−R,R),(端点是否属于收敛域,需要再探讨) R lim ⁡ n → ∞ ∣ a n a n 1 ∣ R\lim_{n…

Spring整合RabbitMQ——消费者

1.配置consumer xml配置文件 2. 实现MessageListener接口 并重写onMessage方法

数组01-二分查找算法

目录 数组如何实现随机访问 两个关键词 数组的特点 根据下标随机访问数组元素 为什么数组要从0开始编号,而不是从1开始 LeetCode之路——704. 二分查找 Code 二分查找算法 数组如何实现随机访问 数组(Array)是一种线性表数据结构。它…