当前位置: 首页 > news >正文

【SQLAlchemy】第四篇——事务

可以把事务理解为一系列操作的集合:这些操作要么全部执行,要么一个也不执行——这样就可以保证数据的一致性和可靠性。在执行更新和删除操作时,尤其要注意利用事务的这个特征。

SQLAlchemy中提供了许多方法来利用事务。

1、如何确保操作生效以及为操作“上保险”?

已经知道,从Engine生成一个Connection对象并执行一些操作的方式如下:

from sqlalchemy import create_engine, text
engine = create_engine("sqlite+pysqlite:///:memory:", echo=True, future=True)
# 存储在内存中的sqlite数据库,这样可以无须启动任何服务,也不会产生任何文件。with engine.connect() as conn:result = conn.execute(text("select 1+1;"))

由于设置了打印执行日志(echo=True),可以在python console中看到整个执行过程:

2023-06-01 16:03:30,189 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2023-06-01 16:03:30,190 INFO sqlalchemy.engine.Engine select 1+1;
2023-06-01 16:03:30,190 INFO sqlalchemy.engine.Engine [generated in 0.00025s] ()
2023-06-01 16:03:30,190 INFO sqlalchemy.engine.Engine ROLLBACK

实际上,上述语句的执行过程是:先开启了一个事务,然后执行对应的操作,最后再回滚。也就是说,通过engine.connect()获取的连接对象,在执行完操作后默认是将事务回滚的,从而不对数据库的数据产生任何影响。因此,如果用户想要执行增删改等操作,那么必须显示地进行提交:

with engine.connect() as conn:conn.execute(text("CREATE TABLE some_table (x int primary key, y int)"))conn.execute(text("INSERT INTO some_table (x, y) VALUES (:x, :y)"),[{"x": 1, "y": 1}, {"x": 2, "y": 4}],)conn.commit()  # 必须手动提交,否则更改不会生效

利用上述特性,将所有需要进行的操作放到一起,最后提交,就可以保证要么全部生效,要么都不生效:

with engine.connect() as conn:conn.execute(text("delete from some_table where x=1"))conn.execute(text("insert into some_table (x, y) values (2, 3)"))# 插入操作由于主键冲突无法执行,那么上一条删除操作也不会生效conn.commit()

利用try...except...,可以进一步对上述语句进行包装:

with engine.connect() as conn:try:conn.execute(text("delete from some_table where x=1"))conn.execute(text("insert into some_table (x, y) values (2, 3)"))conn.commit()print("成功")except:conn.rollback()print("失败,回滚")

2、通过engine.begin()来封装为事务

通过engine.begin()也可以获得一个连接对象,所不同的是,这样获得的连接对象在执行操作后,会自动进行提交。如果执行过程中出错,则会自动回滚:

with engine.begin() as conn:conn.execute(text("delete from some_table where x=1"))conn.execute(text("insert into some_table (x, y) values (2, 3)"))

可以在console中看到如下信息:

2023-06-01 17:38:06,526 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2023-06-01 17:38:06,527 INFO sqlalchemy.engine.Engine delete from some_table where x=1
2023-06-01 17:38:06,527 INFO sqlalchemy.engine.Engine [cached since 1692s ago] ()
2023-06-01 17:38:06,527 INFO sqlalchemy.engine.Engine insert into some_table (x, y) values (2, 3)
2023-06-01 17:38:06,528 INFO sqlalchemy.engine.Engine [cached since 1692s ago] ()
2023-06-01 17:38:06,528 INFO sqlalchemy.engine.Engine ROLLBACK
[错误信息]

最后的ROLLBACK表明,语句执行过程中出现了错误。

类似地,利用try...except...,可以进一步捕获错误:

try:with engine.begin() as conn:conn.execute(text("delete from some_table where x=1"))conn.execute(text("insert into some_table (x, y) values (2, 3)"))
except Exception as e:print(f"出错,回滚, {e}")

相关文章:

【SQLAlchemy】第四篇——事务

可以把事务理解为一系列操作的集合:这些操作要么全部执行,要么一个也不执行——这样就可以保证数据的一致性和可靠性。在执行更新和删除操作时,尤其要注意利用事务的这个特征。 SQLAlchemy中提供了许多方法来利用事务。 1、如何确保操作生效…...

浅谈QMap中erase与remove的区别

QMap中erase与remove的区别 QMap中erase与remove的区别分别使用erase和remove删除元素使用erase删除元素使用remove删除元素代码讲解 QMap中erase与remove的区别 在实践中发现erase删除元素之后,其迭代器自动指向下一个元素,而remove删除元素之后迭代器…...

FastThreadLocal 原理解析

FastThreadLocal 每个 FastThread 包含一个 FastThreadLocalMap,每个 FastThreadLocalThread 中的多个 FastThreadLocal 占用不同的索引。每个 InternalThreadLocalMap 的第一个元素保存了所有的 ThreadLocal 对象。之后的元素保存了每个 ThreadLocal 对应的 value …...

设计模式B站学习(一)(java)

这里写目录标题 一、设计模式概述1.1 软件设计模式的产生背景1.2 软件设计模式的概念1.3 学习设计模式的必要性1.4 设计模式分类 二、UML图2.1 类图概述2.2 类图的作用2.3 类图表示法2.3.1 类图表示方法2.3.2 类与类之间关系的表示方法2.3.2.1 关联关系2.3.2.2 聚合关系2.3.2.3…...

Pandas如何轻松按位置删除多重索引列?

在Pandas处理DataFrame数据的过程中,我们常常需要删除某些不需要的列。那么,如何高效地按位置删除Pandas DataFrame的多重索引列呢? 今天分享在Pandas中按位置删除多重索引列的具体方法: 第一步:获取所有列标签 使用df.columns获取DataFrame的所有列标…...

第五十七天学习记录:C语言进阶:结构体链表的自学

先展示一段代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h> #include <stdlib.h>// 定义链表节点结构体 typedef struct Node {int value;struct Node* next; } Node;int main() {// 创建链表头指针Node* head (Node*)malloc(sizeof(Node…...

【一次调频】考虑储能电池参与一次调频技术经济模型的容量配置方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

ICV报告: 智能座舱SoC全球市场规模预计2025年突破50亿美元

在智能化、互联化车辆需求不断增加的推动下&#xff0c;汽车行业正在经历一场范式转变。这一转变的前沿之一是智能座舱SoC。本市场研究报告对智能座舱SoC市场进行了全面的分析&#xff0c;包括其应用领域、当前状况和主要行业参与者。 智能座舱SoC指的是现代汽车智能座舱系统的…...

在can协议的基础下编写DBC文件,然后使用该DBC文件下发can协议到底盘完整流程

目录 前言一、VectorCANdb下载及安装二、DBC文件的编写1.新建dbc文件2.建立dbc2.1根据CAN协议设置以下的signals2.2设置报文2.3建立报文与信号的关系2.4建立节点 三、编写程序使用UDP通信下发can协议1.查看can口、电脑ip以及端口号2.编写测试程序 前言 最近完成了一个项目&…...

工业传感器有哪些?

工业传感器是指能在工业制造过程能将感受的力、热、光、磁、声、湿、电、环境等被测量转换成电信号输出的器件与装置&#xff0c;在各种化工、机械、汽车等工业场景上都有应用。 工业传感器有哪些&#xff1f; 工业传感器由于不同的特性也被分为多种不同的类别&#xff0c;主要…...

Docker应用部署之Nginx

部署nginx 要求&#xff1a;在docker容器中部署nginx&#xff0c;并通过外部机器访问nginx 步骤&#xff1a; 1.搜索nginx镜像 docker search nginx 2.拉取nginx镜像 docker pull nginx 3.创建容器 #在root目录下创建nginx目录用于存放nginx项目 mkdir ~/nginx cd ~/ng…...

TerminalWorks TSPrint/TSScan/TSWebCam Crack

/ 远程桌面打印软件&#xff0c;TerminalWorks TSPrint Server/Client 从远程服务器打印到本地打印机的 简单方法 TSPrint 为您提供了一个简单的远程桌面打印软件&#xff0c;以及使 Windows 终端服务操作更容易的附加工具。有选择地启用或禁用功能&#xff0c;以便您可以完全…...

如何使用Springboot实现文件上传和下载,并为其添加实时进度条的功能

文件上传和下载是Web开发中非常基础的功能&#xff0c;但在实际开发中&#xff0c;我们经常需要实时显示文件上传或下载的进度。这篇文章将介绍如何使用Springboot实现文件上传和下载&#xff0c;并为其添加实时进度条的功能。 文件上传 添加Maven依赖项 首先&#xff0c;我…...

安装并新建windows下wxwroks7.0 bootrom工程

双击steup.exe 直接next 直接next 选择typical&#xff0c;然后next I accept 安装完成finish 现在双击Workbench 4&#xff0c;新建vxworks7.0工程&#xff0c;会出现下面的情况&#xff0c;因为没有licence 安装licence&#xff0c;将zwrsLicense-vx7-perm.lic粘贴到安装目…...

element-ui表格el-table的使用

先给大家展示一下效果 Table 属性 属性名说明类型可选值默认值data显示的数据array——heightTable 的高度&#xff0c; 默认为自动高度。 如果 height 为 number 类型&#xff0c;单位 px&#xff1b;如果 height 为 string 类型&#xff0c;则这个高度会设置为 Table 的 sty…...

Backtrader官方中文文档:第八章Indicators指标

本文档参考backtrader官方文档,是官方文档的完整中文翻译,可作为backtrader中文教程、backtrader中文参考手册、backtrader中文开发手册、backtrader入门资料使用。 Indicators指标章节目录 指标(Indicator)指标的使用__init__ 对比 next指标在`__init__`阶段的执行过程指标在…...

CAP原则

CAP原则又称CAP定理&#xff0c;指的是在一个分布式系统中&#xff0c;存在Consistency&#xff08;一致性&#xff09;、Availability&#xff08;可用性&#xff09;、Partition tolerance&#xff08;分区容错性&#xff09;&#xff0c;三者不可同时保证&#xff0c;最多只…...

【PowerQuery】M语言的使用产品和使用场景

当然PowerQuery的M语言应用场景不只是引用在PowerBI和Excel中,它具有广泛的应用场景。目前我们可以在以下产品的使用场景中应用到M语言。 Excel PowerQuery应用Excel通过M语言可以实现整体数据的清洗和重构。  PowerBI 的PowerQuery应用 PowerBI也是通过M语言来实现数据…...

【Linux】遇事不决,可先点灯,LED驱动的进化之路---1

【Linux】遇事不决&#xff0c;可先点灯&#xff0c;LED驱动的进化之路---1 前言&#xff1a; 一、最简单的LED驱动程序 1.1 字符设备驱动程序框架 1.2 程序实战 1.2.1 驱动程序&#xff08;led_drive_simple.c&#xff09; 1.2.2 应用程序&#xff08;led_test_simple.c…...

hive任务reduce步骤卡在99%原因及解决

我们在写sql的时候经常发现读取数据不多&#xff0c;但是代码运行时间异常长的情况&#xff0c;这通常是发生了数据倾斜现象。数据倾斜现象本质上是因为数据中的key分布不均匀&#xff0c;大量的数据集中到了一台或者几台机器上计算&#xff0c;这些数据的计算速度远远低于平均…...

Pixel Aurora Engine基础教程:Streamlit状态管理与多会话隔离机制

Pixel Aurora Engine基础教程&#xff1a;Streamlit状态管理与多会话隔离机制 1. 认识Pixel Aurora Engine Pixel Aurora是一款基于AI扩散模型的高端绘图工作站&#xff0c;采用独特的复古像素游戏风格界面。这款"虚拟游戏机"能将文字描述转化为极具视觉冲击力的像…...

Mac环境OpenClaw深度优化:Qwen3-4B模型推理速度提升30%方案

Mac环境OpenClaw深度优化&#xff1a;Qwen3-4B模型推理速度提升30%方案 1. 为什么需要优化OpenClaw的模型推理速度 上周我在用OpenClaw处理一个简单的文件整理任务时&#xff0c;发现整个流程耗时比预期长了近一倍。通过日志排查才发现&#xff0c;大部分时间都消耗在等待Qwe…...

【回眸】头马演讲备稿演讲框架——出走的莉莉丝

其实我原本是不知道莉莉丝的&#xff0c;在坐有人知道莉莉丝的故事吗&#xff1f;&#xff08;互动一下&#xff09;莉莉丝本来和亚当一样&#xff0c;也是一个人&#xff0c;但她为了追求与亚当平等&#xff0c;逃脱了伊甸园&#xff0c;于是一根“肋骨”变成了夏娃&#xff0…...

CDN 无法播放音视频?流媒体回源与 Range 配置修复

流媒体应用现在越来越普及&#xff0c;CDN&#xff08;内容分发网络&#xff09;早已成为音视频流畅播放的核心支撑——靠边缘节点就近分发&#xff0c;既能降低延迟&#xff0c;又能减轻源站压力&#xff0c;让用户不用长时间等待就能看高清内容。但实际运维中&#xff0c;“C…...

FinalBurn Neo技术指南:现代设备复刻街机厅沉浸体验全攻略

FinalBurn Neo技术指南&#xff1a;现代设备复刻街机厅沉浸体验全攻略 【免费下载链接】FBNeo FinalBurn Neo - We are Team FBNeo. 项目地址: https://gitcode.com/gh_mirrors/fb/FBNeo 如何在现代设备上复刻街机厅的沉浸体验&#xff1f;FinalBurn Neo&#xff08;FBN…...

AI命理工具实测:主流大模型八字紫微能力对比及避坑指南

1. AI命理新风向&#xff1a;当大模型碰撞传统术数 最近身边刮起了一阵“AI命理”的热潮&#xff1a;做开发的朋友电脑里存着排盘工具包&#xff0c;运营岗的同事午休时在研究紫微斗数星曜含义&#xff0c;就连开策划会的间隙&#xff0c;都有人拿着AI输出的六爻结果讨论项目走…...

Java程序员的云原生时代生存指南:面向软件测试从业者的专业视角

在技术浪潮的冲击下&#xff0c;云原生已从概念演进为产业标准。对于广大Java程序员而言&#xff0c;这既是挑战也是机遇。传统的技术栈和开发模式正在经历深刻变革&#xff0c;而软件测试作为保障质量的关键环节&#xff0c;其理念与实践也随之迭代。 一、 挑战审视&#xff…...

构建Pixel Couplet Gen的微信小程序:让AI春联触手可及

构建Pixel Couplet Gen的微信小程序&#xff1a;让AI春联触手可及 1. 项目背景与价值 春节贴春联是中国传统文化的重要组成部分&#xff0c;但现代人往往缺乏时间和书法技能来创作个性化春联。Pixel Couplet Gen作为一款AI春联生成模型&#xff0c;能够根据用户输入自动生成像…...

Linux下CMake多版本共存实战:不卸载旧版也能用上新功能

Linux下CMake多版本共存实战&#xff1a;不卸载旧版也能用上新功能 在软件开发的世界里&#xff0c;版本管理就像一场永不停歇的舞蹈。想象一下这样的场景&#xff1a;你正在维护一个历史悠久的C项目&#xff0c;突然客户要求你同时开发一个全新的模块&#xff0c;而这个模块需…...

从MATLAB/Python代码实现反推Newmark-β法:理解线性加速度假设如何变成迭代算法

从代码实现反推Newmark-β法&#xff1a;线性加速度假设的工程实践指南 在结构动力学分析中&#xff0c;地震响应、风荷载等时程分析问题常需要求解二阶微分方程。Newmark-β法作为经典数值解法&#xff0c;通过线性加速度假设将连续问题离散化。但教科书往往止步于公式推导&am…...