SQLAlchemy关联表删除策略设置

news2024/11/25 14:32:39

目录

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 relationship

Base = 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,ForeignKey


from db_util import Base,Session


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'))  # 默认不让删主表数据
  # 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.coloradmin.cn/o/1043002.html

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

相关文章

ElementUI - 主页面--动态树右侧内容管理

一.左侧动态树 1.定义组件 ①样式&数据处理 <template><el-menu class"el-menu-vertical-demo" background-color"#334157"text-color"#fff" active-text-color"#ffd04b" :collapse"collapsed" router :def…

手撸RPC【gw-rpc】

文章目录 基于 Netty 的简易版 RPC需求分析简易RPC框架的整体实现协议模块 &#x1f4d6;自定义协议 &#x1f195;序列化方式 &#x1f522; 服务工厂 &#x1f3ed;服务调用方 ❓前置知识——动态代理&#x1f573;️Proxy类InvocationHandler 接口 RPC服务代理类内嵌Netty客…

轻松学会 Git(三):掌握 Git 的远程操作

文章目录 前言一、分布式版本控制系统的理解1.1 什么是分布式版本控制系统&#xff1f;1.2 工作原理1.3 分布式版本控制系统的优势 二、初识 Git 远程仓库2.1 远程仓库的概念2.2 Git 远程操作2.3 远程仓库托管服务 三、新建远程仓库四、克隆远程仓库到本地4.1 使用 HTTPS 方式克…

记录一下 malloc 是如何分配内存的

系统深入学习笔记-malloc 以 32 位系统为例&#xff0c;&#xff0c;通过这张图你可以看到&#xff0c;用户空间内存从低到高分别是 6 种不同的内存段&#xff1a; 代码段&#xff0c;包括二进制可执行代码&#xff1b;数据段&#xff0c;包括已初始化的静态常量和全局变量B…

MySQL ——多条件查询(like)

一、基本语法 MySQL LIKE多条件查询语句的基本语法如下&#xff1a; SELECT * FROM table WHERE column1 LIKE %value1% AND column2 LIKE %value2%; 二、说明 在上面的多条件查询语句中&#xff0c;%是通配符&#xff0c;表示任意字符。如果您在LIKE语句中使用%字符&#x…

刚学习编写代码时的愚蠢瞬间:初学者的代码经验分享

刚学习编写代码时的愚蠢瞬间&#xff1a;初学者的代码经验分享 刚学习编写代码时的愚蠢瞬间&#xff1a;初学者的代码经验分享摘要引言糟糕的变量命名&#x1f937;‍♂️ 问题&#x1f605; 解决方案 异常处理的忽略&#x1f648; 问题&#x1f60e; 解决方案 魔法数值的滥用&…

沈阳市浑南区、沈阳国际软件园领导一行莅临中睿天下总部考察指导

近日&#xff0c;沈阳市浑南区委常委、常务副区长傅涵&#xff0c;沈阳国际软件园总经理张永鹏一行会见了中睿天下高级合伙人兼市场负责人周学龙。沈阳高新区管委会经发局局长王博&#xff0c;沈阳高新区管委会投资促进局姜振杰&#xff0c;沈阳国际软件园驻京办主任王军超&…

基础数据标准落标白皮书

1.定义 数据是由特定的环境产生的&#xff0c;这些环境因素包括生产者、时间、系统等&#xff0c;这就造成了同一个语义的数据&#xff0c;会有多种不同的定义方法&#xff0c;这给后期进行数据汇集和整合带来障碍&#xff0c;因此&#xff0c;数据处理的前奏就是数据标准化&a…

公司文件加密防泄密软件有哪些?企业防泄密软件都有哪些功能?

在当今的信息化时代&#xff0c;数据已经成为了企业的重要资产。其中&#xff0c;公司内部的文件、文档、数据库等数据安全至关重要。然而&#xff0c;随着网络攻击手段的不断升级&#xff0c;企业数据泄露事件屡见不鲜&#xff0c;给企业带来了巨大的经济损失和声誉损害。因此…

Rust 围炉札记

文章目录 一、安装 一、安装 Rust in Visual Studio Code Rust 官网 windows系统下Rust环境搭建以及vscode调试环境配置 123

香橙派OrangePi的风扇怎么接

跟树莓派类似&#xff0c;看主板上GPIO口的阵脚定义 树莓派的引脚定义官网&#xff1a;Raspberry Pi Documentation - Raspberry Pi hardware 树莓派的4口和6口可以接一个5V小风扇&#xff0c;4口接正极&#xff0c;6口接负极即可&#xff0c;由于接口相近&#xff0c;可以用于…

爬楼梯Java(斐波那契数列)

题目:有n阶楼梯,一次只能爬一层或者两层,请问有多少种方法? 这类题目其实都可以用斐波那契数列来解决,比如: 一阶楼梯只有一种方法 二阶楼梯有(11,2)两种方法 三阶楼梯有(111,12,21)三种方法 四阶楼梯有(1111,121,112,22,211)五种方式 五阶楼梯有(11111,1112,122,1211,1…

云原生之使用Docker部署RSS阅读器Huntly

云原生之使用Docker部署RSS阅读器Huntly 一、Huntly介绍1.1 Huntly简介1.2 Huntly功能2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Huntly镜像五、部署Huntly5.1 创建挂载目录5.2 创建Hun…

技术干货 | JMeter实现参数化的4种方式

参数化释义 什么是参数化&#xff1f;从字面上去理解的话&#xff0c;就是事先准备好数据&#xff08;广义上来说&#xff0c;可以是具体的数据值&#xff0c;也可以是数据生成规则&#xff09;&#xff0c;而非在脚本中写死&#xff0c;脚本执行时从准备好的数据中取值。 参数…

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

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

低代码代理商选对合作对象,和靠谱的低代码携手共进

随着低代码发展不断升温&#xff0c;市场上涌现出许多优秀的低代码开发平台&#xff0c;如阿里、腾讯、微软等企业相继推出了自己的低代码产品。 据IDC新近发布的《2022下半年中国低代码与零代码软件市场跟踪报告》显示&#xff0c;预计2023年中国低代码与零代码软件市场规模将…

10.6 开关型稳压电路

线性稳压电路具有结构简单、调节方便、输出电压稳定性强、纹波电压小等优点。但是&#xff0c;由于调整管始终工作在放大的状态&#xff0c;自身功耗较大&#xff1b;故效率较低&#xff0c;甚至仅为 30 % ∼ 40 % 30\%\sim40\% 30%∼40%。而且&#xff0c;为了解决调整管散热…

新的阶乘(筛素数)--2023百度之星初赛第三场

解析&#xff1a; 因为一个素数 x&#xff0c;他的所有倍数中都有因子为 x&#xff0c;所以先筛出所有素数&#xff0c;然后对于某个素数&#xff0c;累加他后面所有倍数的因子 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N1e75; int…

Vue中props报错或问题解决

一、[Vue warn]: The data property "inputUserData" is already declared as a prop. Use prop default value instead. 意思&#xff1a;"inputUserData"这个值已经声明成了一个prop数据&#xff0c;挂载的时候将默认使用prop中的"inputUserData&q…

自学WEB后端02-基于Express框架完成一个交互留言板!

提示&#xff1a; 浏览器V8是JavaScript的前端运行环境 Node.js 是JavaScript 的后端运行环境 Node.js 中无法调用 DOM 和 BOM等浏览器内置 API 这个作业案例包含2部分内容&#xff0c; 第一部分是前端 前端完成界面内容CSS框架 第二部分是后端 完成用户留言存储&#xf…