会话管理:深入理解SQLAlchemy会话及其事务处理

news2024/11/26 0:50:09

引言

SQLAlchemy是一个流行的Python SQL工具包和对象关系映射(ORM)系统,它提供了一个高层的ORM以及底层的SQL表达式语言。在SQLAlchemy中,会话(Session)是与数据库交互的核心概念,它不仅负责对象的持久化,还负责事务的管理。对于新手来说,理解会话的工作原理和事务处理是至关重要的。本文将详细介绍SQLAlchemy会话的管理,包括增删改查操作,并展示如何管理事务。
在这里插入图片描述

SQLAlchemy会话基础

什么是会话?

在SQLAlchemy中,会话是一个持久化对象的临时存储,它允许你将对象的更改提交到数据库中。会话是ORM操作的起点和终点。

会话的生命周期

  1. 创建会话:通过sessionmaker绑定到特定的数据库引擎。
  2. 添加对象:将对象添加到会话中。
  3. 查询对象:从会话中查询对象。
  4. 提交会话:将更改保存到数据库。
  5. 关闭会话:释放资源。

创建会话

首先,我们需要创建一个会话工厂,这通常在应用的配置阶段完成。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# 创建数据库引擎
engine = create_engine('sqlite:///:memory:')

# 创建会话类
Session = sessionmaker(bind=engine)

# 实例化会话
session = Session()

增删改查操作

添加(Create)

添加操作通常涉及到创建一个新的对象,并将其添加到会话中。

from your_model import YourModel

new_object = YourModel(name='New Object')
session.add(new_object)

查询(Read)

查询操作可以是简单的,也可以是复杂的,取决于你的需求。

# 查询所有对象
all_objects = session.query(YourModel).all()

# 查询特定对象
specific_object = session.query(YourModel).filter_by(name='New Object').first()

更新(Update)

更新操作涉及到修改已存在的对象。

# 更新特定对象
specific_object.name = 'Updated Object'
session.commit()  # 注意提交更改

删除(Delete)

删除操作涉及到从会话中移除对象。

session.delete(specific_object)
session.commit()  # 注意提交更改

事务管理

事务的重要性

事务确保了数据库操作的原子性、一致性、隔离性和持久性(ACID属性)。在SQLAlchemy中,会话提供了事务的边界。

事务的提交和回滚

try:
    # 执行一些操作
    session.add(new_object)
    session.commit()  # 提交事务
except:
    session.rollback()  # 回滚事务
    raise
finally:
    session.close()  # 关闭会话

嵌套事务

SQLAlchemy也支持嵌套事务,但需要额外的配置。

with session.begin_nested():  # 开启嵌套事务
    new_object = YourModel(name='Nested Object')
    session.add(new_object)
    # 如果发生异常,嵌套事务将被回滚

案例分析

案例一:简单的CRUD操作

假设我们有一个简单的用户模型User,我们将展示如何使用会话进行CRUD操作。

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)

# 创建会话
session = Session()

# 添加用户
new_user = User(name='Alice')
session.add(new_user)
session.commit()

# 查询用户
users = session.query(User).all()
for user in users:
    print(user.name)

# 更新用户
user_to_update = session.query(User).filter_by(name='Alice').first()
user_to_update.name = 'Alice Updated'
session.commit()

# 删除用户
session.delete(user_to_update)
session.commit()

# 关闭会话
session.close()

案例二:事务管理

在这个案例中,我们将展示如何在一个事务中执行多个操作,并在出现错误时回滚。

try:
    # 添加多个用户
    user1 = User(name='Bob')
    user2 = User(name='Charlie')
    session.add(user1)
    session.add(user2)
    
    # 故意引发错误
    raise Exception('Something went wrong!')

    # 提交事务
    session.commit()
except Exception as e:
    # 回滚事务
    session.rollback()
    print(f'Error occurred: {e}')
finally:
    # 关闭会话
    session.close()

总结

SQLAlchemy的会话管理是ORM操作的核心。通过理解会话的生命周期和事务管理,你可以更有效地与数据库交互。本文提供了会话管理的基础知识,并通过代码示例和案例分析,帮助新手理解如何在实际应用中使用SQLAlchemy进行增删改查操作和事务管理。

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

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

相关文章

外卖配送小程序源码系统 带源代码包以及搭建部署教程

系统概述 外卖配送小程序源码系统是一套完整的解决方案,旨在帮助用户快速搭建自己的外卖配送平台。它融合了先进的技术和创新的设计理念,为用户提供了一个稳定、高效、易用的系统环境。 该系统基于移动端开发,能够与各种操作系统兼容&#…

2.stm32 GPIO输出

GPIO简介 GPIO(General Purpose Input Output)通用输入输出口 可配置为8种输入输出模式 引脚电平:0V~3.3V,部分引脚可容忍5V 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等 …

网络变压器的作用是什么

在网络通讯主板上,在PHY芯片与RJ45连接器之间,会有一个黑属的小方块,这个东西就叫网络变压器,书名"数据录”人们常把它称为网络隔真变压务,LAN变压客,局域网变压器,滤波器等。 它在一块网络设备接口上所起的作用主要有两个; 一、传输数据,它把PHY送出来的差分信号用差模合…

电子元器件是电子电路中的基本组成部分

电子元器件是电子电路中的基本组成部分,主要包括以下几类: 一、电阻器 作用 限流:限制电路中的电流大小。分压:将电压按照一定比例分配。负载:作为电路中的负载元件。 分类 固定电阻:阻值固定不变。可变电阻…

ros1编译wpr_simulation库

目录 安装项目依赖包编译将环境参数加载到终端程序中运行编译好的ros程序 首先你下载好这个库以后。 安装项目依赖包 scripts库中,存放的是一些依赖项安装脚本以及python脚本。 进入到这个路径的终端。 输入 ./install_for_noetic.sh编译 输入下面命令&#xf…

小猿口算自动PK脚本

大家好,我是小黄。 近期,众多大学生炸鱼小猿口算APP,把一众小学生都快虐哭了,小黄听闻后,也跃跃欲试。对此小黄也参考网上的资料写了一个自动Pk的脚步。 首先大家需要安装一个pytorch环境过程中,如果小伙伴对此不熟悉的…

【YOLOv11】ultralytics最新作品yolov11 AND 模型的训练、推理、验证、导出 以及 使用

​目录 一 ultralytics公司的最新作品YOLOV11 1 yolov11的创新 2 安装YOLOv11 3 PYTHON Guide 二 训练 三 验证 四 推理 五 导出模型 六 使用 文档:https://docs.ultralytics.com/models/yolo11/ 代码链接:https://github.com/ultralytics/ult…

MyBatis 用法详解

文章目录 一、普通 SQL1.1 注解实现:1.1.1 参数传递:1.1.2 增(Insert):1.1.3 删(Delete):1.1.4 改(Update):1.1.5 查(Select&#xff…

大疆M2006+C610 pid参数调优

官方给的示例代码里给的是1.5, 0.1, 0 但试了下空转时显然不太行. 自己摸索出0.8, 0.03, 0 表现如图中的蓝色线 期望速度先两秒的1000,然后一秒的2000,一秒的3000, 0 2000 表现还不错,可以看到0.5秒后与期望值的差距控制在大概10%之内,但还是感觉有些过调 对了先说一下基础知识…

UnityComputeShader Challenge2

UnityComputeShader Challenge2 大部分内容与Challenge1中的一致,重复的地方不做说明 using UnityEngine; using System.Collections;public class Challenge2 : MonoBehaviour {public ComputeShader shader;//纹理的分辨率,正方形public int texReso…

PHP拼团接龙商城系统小程序源码

拼团接龙商城系统,解锁购物新乐趣! 🎉 拼团接龙,购物也能玩出新花样 你是否厌倦了单调的购物方式?想要尝试一种既有趣又实惠的购物新体验?那么,“拼团接龙商城系统”绝对是你的不二之选&#…

fluke双绞线测试-外部串扰AxTALK-测试DEMO样本

外部串扰是电缆束或跳线中相邻电缆之间传输的噪音或串扰。外部串扰是 10GBASE-T 通信应用中主要的噪音源。 电缆线对(NEXT 和 FEXT)之间的串扰信号与传输信号有关,所以网络设备可以利用数字信号处理 (DSP) 技术除去数据信号中的串扰信号。但…

力扣题11~20

题11(中等): 思路: 这种题目第一眼就是双循环,但是肯定不行滴,o(n^2)这种肯定超时,很难接受。 所以要另辟蹊径,我们先用俩指针(标志位)在最左端和最右端&am…

Android iOS 使用 ARMS 用户体验监控(RUM)的最佳实践

作者:元泊 引言 背景信息 随着移动互联网技术的持续演进与全民互联网时代的深入,用户在 Android、iOS 应用程序、小程序、H5 游戏及网页等多元化平台上的交互时长显著增长。这一趋势加剧了用户体验(UX)场景的复杂性&#xff0c…

谈到数据集成和数据分析,这三个概念你得分清楚!

谈及数据集成和数据分析相关的概念,总是会提到异构数据源、异构数据库和分布式数据库,他们所涉及到的方面略有不同,今天来详细说下它们之间的区别! 一、异构数据源 异构数据源是指不同类型、不同结构、不同格式的数据源。 在数据…

PyQt基本功能

简单的窗口 #!/usr/bin/python3 # -*- coding: utf-8 -*- import sys # 这⾥引⼊了PyQt5.QtWidgets模块,这个模块包含了基本的组件 from PyQt5.QtWidgets import QApplication, QWidgetif __name__ __main__:# 每个PyQt5应⽤都必须创建⼀个应⽤对象# sys.argv是⼀…

雷达图怎么绘制?!超简单,一次性告诉你Python和R绘制方法~~

今天给大家介绍的的图表为雷达图(Radar/Spider chart),这种类型图表在生活中较常使用,是一种以从同一点开始的轴上表示的三个或更多个定量变量的二维图表的形式显示多变量数据的图形方法。较常用的场景多为分析企业经营状况(收益性、生产性、流动性、安全性和成长性…

Vatee万腾平台:企业数字化转型的加速器

在当今这个信息化、数字化高速发展的时代,企业要想在激烈的市场竞争中立于不败之地,就必须紧跟时代步伐,实现数字化转型。而Vatee万腾平台,正是这样一款能够助力企业快速、高效完成数字化转型的利器,它如同一位经验丰富…

【MySQL】基本查询(下):更新、删除

3.Update 语法: UPDATE table_name SET column expr [, column expr ...] [WHERE ...] [ORDER BY ...] [LIMIT ...]举几个例子: 将孙悟空同学的数学成绩变更为 80 分: 将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 …