SqlAlchemy使用教程(二) 入门示例及编程步骤

- SqlAlchemy使用教程(一) 原理与环境搭建
- SqlAlchemy使用教程(三) CoreAPI访问与操作数据库详解
二、入门示例与基本编程步骤
在第一章中提到,Sqlalchemy提供了两套方法来访问数据库,由于Sqlalchemy 官方文档结构有些乱,对于ORM的使用步骤的描述散布于各个章节,再加上SqlAlchemy2.x 与j1.x版本差异较大,很多介绍SqlAlchemy的文章上来就讲ORM,但示例时又使用CoreAPI,常令初学者困惑。本人建议先使用Core API来访问数据库,使用上更接近于 Sqlite3, Mysql-connector 等的方式,入门容易,而且也可以实现1套代码支持各类数据库。等熟悉CoreAPI的 MetaData, Sql Express Language以后,再学习使用ORM就会容易很多。
因此,本教程开头3章均以Core API方式为主, 文中示例均在Python3.10 + SQLAlchemy 2.0.23 版本上通过测试。
1、DB API访问数据库入门示例
示例功能:
- 建立数据库连接
- 通过Core API访问数据库(创建表,插入数据,查询数据)
1.1建立数据库连接
Step-1: 创建数据库引擎对象
DB Engine 是个全局变量,允许在其上建立多个connection访问数据库。
创建 DB Engine 实例的方法:
create_engine( db_url )
db_url参数在后面章节中详解介绍。本例使用sqlite3 内存数据库。
from sqlalchemy import create_engine
engine = create_engine("sqlite:///:memory:", echo=True)
Step-2 创建connect对象
connection 对象用于数据库操作。其支持context with语法
from sqlalchemy import text
with engine.connect() as conn:result = conn.execute(text("select 'hello world'"))print(result.all())
output
[('hello world',)]
Step-3 执行SQL Express 语句
text() 是SQL express 的最简单使用形式, 方便传值
创建1张表
conn.execute(text("CREATE TABLE some_table (x int, y int)"))
插入数据,
conn.execute(text("INSERT INTO some_table (x, y) VALUES (:x, :y)"),[ { "x": 1, "y": 1}, {"x": 2, "y": 4 } ],)
SQL express传参语法:
- 参数占位使用
:x, :y, 参数名前加:分号 - 实际值用
[ dict, … ]方式给出。
提交事务, 即将操作保存至数据库
conn.commit()
Step4 执行查询并获取结果
with engine.connect() as conn:result = conn.execute(text("SELECT x, y FROM some_table"))for row in result:print(f"x: {row.x} y: {row.y}")
本例中,select x,y from some_table 将返回所有行
返回结果类型为 sqlalchemy.engine.cursor.CursorResult,是1个由 object 组成的可迭代对象。提供了多种方法访问结果数据:
- fetchall(), fetchone(), fetchmany() ,使用tuple方式读取全部、单条、多条数据
- all() 获取所有数据,返回列表
- mappings(), 返回列表,元素为dict类型,
- keys() 获取对象属性名(字段名)
还可以向查询语句传参:
result = conn.execute(text("SELECT x, y FROM some_table WHERE y > :y"), {"y": 2})
2、SqlAlchemy 异常处理
编写代码时1个好习惯:先写出异常与错误处理语句框架,再写正常流程部分,这样的习惯可以让代码更健壮,避免程序运行中断或出错。
虽然看似麻烦,但最终代码测试中遇到的问题更少,而且错误日志也更精准,问题定位效率更高,所以这样做将更省时间。
2.1 异常处理代码结构建议
from sqlalchemy import create_engine
from sqlalchemy.exc import IntegrityError, ProgrammingErrorengine = create_engine('mysql://username:password@localhost/mydatabase')try:# 执行数据库操作connection = engine.connect()# ...# 这里是可能引发异常的代码# ...connection.close()
except IntegrityError as e:# 处理唯一性约束违反等完整性错误print(f'Integrity error occurred: {str(e)}')
except ProgrammingError as e:# 处理SQL语法或参数错误print(f'Programming error occurred: {str(e)}')
except SQLAlchemyError as e:# 处理其他SQLAlchemy异常print(f'An error occurred: {str(e)}')
2.2 SQLAlchemy常用的内置异常类
- sqlalchemy.exc.SQLAlchemyError:所有SQLAlchemy异常的基类
- sqlalchemy.exc.InvalidRequestError:无效的请求异常,包括无效的查询或表达式
- sqlalchemy.exc.StatementError:执行SQL语句时出错的异常
- sqlalchemy.exc.IntegrityError:完整性约束错误,例如唯一性约束或外键约束违反等
- sqlalchemy.exc.OperationalError:操作数据库时出错的异常
- sqlalchemy.exc.ProgrammingError:编程错误,例如错误的SQL语法或参数错误等
相关文章:
SqlAlchemy使用教程(二) 入门示例及编程步骤
SqlAlchemy使用教程(一) 原理与环境搭建SqlAlchemy使用教程(三) CoreAPI访问与操作数据库详解 二、入门示例与基本编程步骤 在第一章中提到,Sqlalchemy提供了两套方法来访问数据库,由于Sqlalchemy 官方文档结构有些乱,对于ORM的使用步骤的描…...
HTML+JS+CSS移动端购物车选购界面
代码打包资源下载:【免费】HTMLJSCSS移动端购物车选购界面资源-CSDN文库 关键部分说明: UIGoods 类: 构造函数: 创建 UIGoods 实例时,传入商品数据 g,初始化商品的数据和选择数量。getTotalPrice() 方法…...
微服务治理:为什么要分析微服务的依赖关系?
在微服务架构中,单个服务相互协作以交付功能。这些协作会在服务之间形成依赖关系,其中一个服务依靠另一个服务来完成自己的任务。虽然依赖关系使功能得以实现,但不受控制的依赖关系可能会导致一系列挑战: 复杂性: 错综复杂的依赖…...
【程序员的自我修养—系统调用与API】
系统调用 背景: 为了避免有限的系统资源被多个不同的应用程序同时访问,需要加以保护,避免冲突;提供一套统一的接口,是应用程序能做一些由操作系统支持的行为;接口通过中断的方式实现,Linux使用…...
使用宝塔面板部署后端项目到服务器
文章目录 前言第一步:安装数据库第二步:打包后端项目第三步:配置数据库第四步:部署后端项目第五步:前后端联调测试总结 前言 在之前我已经写了一篇如何去部署前端项目,虽然能访问网站,但是没有…...
走迷宫(c语言)
前言: 制作一个迷宫游戏是一个有趣的编程挑战。首先,我们需要设计一个二维数组来表示迷宫的布局,其中每个元素代表迷宫中的一个格子。我们可以使用不同的值来表示空格、墙壁和起点/终点。接下来,我们需生成迷宫。在生成迷宫的过程…...
两周掌握Vue3(五):自定义指令、路由、ajax
文章目录 一、自定义指令1.创建和使用自定义指令2.钩子函数3.使用参数 二、路由1.创建一个router实例2.在components目录中创建组件3.将路由实例挂载到应用4.使用路由 三、Ajax 代码仓库:跳转 当前分支:05 一、自定义指令 自定义指令是Vue.js框架提供的…...
redis之单线程和多线程
目录 1、redis的发展史 2、redis为什么选择单线程? 3、主线程和Io线程是怎么协作完成请求处理的? 4、IO多路复用 5、开启redis多线程 1、redis的发展史 Redis4.0之前是用的单线程,4.0以后逐渐支持多线程 Redis4.0之前一直采用单线程的主…...
12AOP面向切面编程/GoF之代理模式
先看一个例子: 声明一个接口: // - * / 运算的标准接口! public interface Calculator {int add(int i, int j);int sub(int i, int j);int mul(int i, int j);int div(int i, int j); }实现该接口: package com.sunsplanter.prox…...
【MySQL】数据处理之增删改
文章目录 一、增加(插入)INSERT INTO...VALUES(...,...)VALUES的方式添加情况一:为表的所有字段按默认顺序插入数据情况二:为表的指定字段插入数据情况三:同时插入多条记录 将查询结果插入到表中 二、修改(…...
利用docker的LNMP
目录 服务器环境 任务需求 服务搭建 Nginx Mysql Php 启动 wordpress 服务 服务器环境 容器 操作系统 IP地址 主要软件 nginx CentOS 7 172.20.0.10 Docker-Nginx mysql CentOS 7 172.20.0.20 Docker-Mysql php CentOS 7 172.2…...
Grafana(二)Grafana 两种数据源图表展示(json-api与数据库)
一. 背景介绍 在先前的博客文章中,我们搭建了Grafana ,它是一个开源的度量分析和可视化工具,可以通过将采集的数据分析、查询,然后进行可视化的展示,接下来我们重点介绍如何使用它来进行数据渲染图表展示 Docker安装G…...
Shape-IoU——综合考量边框形状与尺度的度量
今天看到一篇文章主要是提出了一种更有效的IOU度量方法,论文地址在这里,如下所示: 摘要 边界盒回归损失作为检测器定位分支的重要组成部分,在目标检测任务中起着重要作用。现有的边界框回归方法通常考虑GT框和预测框之间的几何关…...
Stack详解(Java)
Stack Java 中的 Stack 是一种基于后进先出(LIFO)原则的数据结构。Stack 类实现了一个标准的堆栈,它继承自 Vector 类,并提供了一些额外的方法来支持堆栈的操作。 下面是一些 Java Stack 类的详细解释: 构造方法&…...
Qt框架学习 --- CTK编译(Qt5.15.2+vs2019+cmake)
系列文章目录 第二章 CTK的测试demo https://blog.csdn.net/yonug1107716573/article/details/135527289 文章目录 系列文章目录前言一、准备工作二、编译步骤1.修改文件2.编译CTK2.1 准备2.2 cmake界面配置2.3 配置编译器2.4 编译的配置设置2.5 选择需要编译的模块2.6 生成2.…...
Flink(十三)【Flink SQL(上)】
前言 最近在假期实训,但是实在水的不行,三天要学完SSM,实在一言难尽,浪费那时间干什么呢。SSM 之前学了一半,等后面忙完了,再去好好重学一遍,毕竟这玩意真是面试必会的东西。 今天开始学习 Flin…...
linux nginx配置链接访问图片
nginx 安装 sudo apt update sudo apt install nginxnginx 启动命令 sudo systemctl restart nginx # 重启 sudo systemctl start nginx #开启 sudo systemctl stop nginx # 关闭 sudo systemctl status nginx # 状态 sudo systemctl restart nginx.service #重启nginx安装成…...
深度学习笔记(二)——Tensorflow环境的安装
本篇文章只做基本的流程概述,不阐述具体每个软件的详细安装流程,具体的流程网上教程已经非常丰富。主要是给出完整的安装流程,以供参考 环境很重要 一个好的算法环境往往能够帮助开发者事半功倍,入门学习的时候往往搭建好环境就已…...
Java实现在线编辑预览office文档
文章目录 1 在线编辑1.1 PageOffice简介1.2 前端项目1.2.1 配置1.2.2 页面部分 1.3 后端项目1.3.1 pom.xml1.3.2 添加配置1.3.3 controller 2 在线预览2.1 引言2.2 市面上现有的文件预览服务2.2.1 微软2.2.2 Google Drive查看器2.2.3 阿里云 IMM2.2.4 XDOC 文档预览2.2.5 Offic…...
阿里云OSS上传视频,可分片上传
uniappH5实现 阿里云OSS上传视频 示例图: 上传视频完整示例代码: 使用npm安装SDK开发包,安装命令为 npm install ali-oss --save accessKeyId 和 accessKeySecret 还有 bucket 替换成你的就行。 multipartUpload 的第一个入参是&#x…...
FxSound驱动开发详解:从Version11到Version14的完整演进历程
FxSound驱动开发详解:从Version11到Version14的完整演进历程 【免费下载链接】fxsound-app FxSound application and DSP source code 项目地址: https://gitcode.com/gh_mirrors/fx/fxsound-app FxSound驱动开发是音频增强技术的核心,从Version1…...
从零到一:在Windows系统上部署JDK11与Neo4j 4.3.5开发环境
1. 环境准备:JDK11与Neo4j 4.3.5的版本选择 刚开始接触Java和图数据库时,我踩过不少版本不兼容的坑。比如有一次装了最新版JDK17,结果Neo4j死活启动不了,折腾半天才发现是版本冲突。所以现在每次搭建环境,我都会先确认…...
Aspen Plus模拟电解质水脱酸:一场化工模拟的奇妙之旅
Aspen Plus模拟电解质水脱酸Aspen 化工过程模拟→电解质水脱酸模拟在温度为 8C、压力为 1 atm、质量流量为 5000 kg/h 的条件下,含有 0.20 wt% CO2、0.15 wt% H2S 和 0.1 wt% NH3 的酸性水流将通过 1.1 atm、质量流量为 1500 kg/h 的干蒸汽进行处理。在化工领域&…...
OptiScaler终极配置指南:解锁游戏画质提升的7个关键技术
OptiScaler终极配置指南:解锁游戏画质提升的7个关键技术 【免费下载链接】OptiScaler DLSS replacement for AMD/Intel/Nvidia cards with multiple upscalers (XeSS/FSR2/DLSS) 项目地址: https://gitcode.com/GitHub_Trending/op/OptiScaler OptiScaler是一…...
创龙T113-i开发板:从SDK解压到镜像打包,一个完整Linux系统构建实录(含80分钟编译避坑)
创龙T113-i开发板实战:从零构建嵌入式Linux系统的完整指南 1. 开发环境准备与SDK解压 第一次接触全志T113-i开发板时,最令人头疼的莫过于搭建开发环境。与常见的树莓派或BeagleBone开发板不同,工业级嵌入式设备往往需要更专业的工具链支持。我…...
nlp_gte_sentence-embedding_chinese-large实战案例:客服工单自动归类与聚类分析
nlp_gte_sentence-embedding_chinese-large实战案例:客服工单自动归类与聚类分析 1. 引言:客服工单处理的痛点与解决方案 每天处理成千上万的客服工单是什么体验?想象一下这样的场景:客服团队每天收到大量用户反馈,从…...
告别重复劳动,用快马平台生成powershell脚本大幅提升数据处理效率
告别重复劳动,用快马平台生成powershell脚本大幅提升数据处理效率 最近接手了一个需要定期汇总销售数据的任务,每个月都要手动合并几十个Excel文件,然后计算各种统计指标。这种重复性工作不仅耗时耗力,还容易出错。直到发现了Ins…...
Windows 10下ISE14.7与Modelsim 10.1c联合安装避坑指南(附完整破解流程)
Windows 10下ISE14.7与Modelsim 10.1c联合安装全流程解析 对于FPGA开发者而言,一套稳定的EDA环境是高效工作的基础。本文将详细介绍如何在Windows 10 64位系统中完成ISE Design Suite 14.7与Modelsim SE 10.1c的联合安装配置,特别针对安装过程中可能遇到…...
SillyTavern角色系统全解析:从入门到高级定制指南
SillyTavern角色系统全解析:从入门到高级定制指南 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 一、基础认知:角色系统的核心架构 在AI交互的世界里,…...
Linux下PCIe AER错误排查实战:从寄存器解析到故障定位
Linux下PCIe AER错误排查实战:从寄存器解析到故障定位 PCIe总线作为现代计算机系统中最重要的高速串行总线之一,其可靠性直接影响整个系统的稳定性。高级错误报告(Advanced Error Reporting,AER)机制是PCIe规范中提供…...
