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, ProgrammingError

engine = 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语法或参数错误等

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用scipy处理图片——旋转任意角度

大纲 载入图片左旋转30度,且重新调整图片大小右旋转30度,且重新调整图片大小左旋转135度,保持图片大小不变右旋转135度,保持图片大小不变 在《使用numpy处理图片——90度旋转》中,我们使用numpy提供的方法,…

庆祝一年的成长

本文字数:2288;估计阅读时间:6 分钟 作者:ClickHouse Team 审校:庄晓东(魏庄) 本文在公众号【ClickHouseInc】首发 随着今年即将结束,我们想要向您表达衷心的感谢,感谢您…

实现STM32烧写程序-(3) Hex文件结构

简介 要对STM32进行更新动作, 就需要对程序文件进行解析, 大部分编译的生成程序文件是Hex或者Bin, 先来看看Hex的结构吧。 资料 Hex文件 简介 Hex文件格式最早由Intel公司于1973年创建。它最初是为了在Intel 8080微处理器上存储和传输二进制数据而设计的。随后,Hex…

XCTF:Hidden-Message[WriteUP]

使用Wireshark打开文件 分析能分析的流,这里直接选择UDP流 分别有两段流,内容都是关于物理的 和flag没啥关系,只能从别的方面下手 分析:整个数据包,全部由UDP协议组成 其中发送IP和接收IP固定不变,数据长…

Leetcode3002. 移除后集合的最多元素数

Every day a Leetcode 题目来源:3002. 移除后集合的最多元素数 解法1:贪心 可以将数组去重后分为三个部分:nums1 独有的,nums2 独有的,nums1 与 nums2 共有的。 求集合 S 时: 先选择两个数组独有的。…

【软件测试】学习笔记-性能测试的基本方法与应用领域

这篇文章探讨并发用户数、响应时间和系统吞吐量这三个指标之间的关系和约束,性能测试七种常用方法,以及四大应用领域。 由于性能测试是一个很宽泛的话题,所以不同的人对性能测试的看法也不完全一样,同样一种方法可能也会有不同的…

第十五届蓝桥杯单片机组备赛——独立键盘矩阵键盘

文章目录 一、按键原理二、独立键盘&矩阵键盘2.1 独立按键2.2 矩阵键盘 一、按键原理 原理很简单,当我们没有按下SW2时,由于上拉电阻得作用,使得输入引脚得信号为高电平,当按下按键后,引脚直接接地,输入…

MySQL面试题 | 08.精选MySQL面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

List集合遍历过程中修改元素(有坑)

说来惭愧,学 java 2年了,对 “Java是值传递” 这句话还没有理解它的精髓,以至于编程的时候出现了一些错误,这里记录一下。 一.问题再现 1.1将List集合中的每个字符串更改为其他值 1.2将List集合中的对象更改为其他对象 二.问题分…

【DolphinScheduler】datax读取hive分区表时,空分区、分区无数据任务报错问题解决

问题背景: 最近在使用海豚调度DolphinScheduler的Datax组件时,遇到这么一个问题:之前给客户使用海豚做的离线数仓的分层搭建,一直都运行好好的,过了个元旦,这几天突然在数仓做任务时报错,具体报…

【Rust日报】2024-01-12 将 Rust 引入 Git 项目

将 Rust 引入 Git 项目 去年年底的假期里,Taylor Blau 花了一些时间思考如何将 Rust 引入 Git 项目。 将 Rust 引入 Linux 内核的重要工作正在进行中。在他们既定的目标中,他认为有一些可能与 Git 项目相关: 由于语言的安全保证,内…

Jenkins+nexus

jiekins安装完成 1、安装java环境 [rootnexus ~]# tar -xf jdk-8u211-linux-x64.tar.gz -C /usr/local [rootnexus ~]# vim /etc/profile.d/java.sh JAVA_HOME/usr/local/jdk1.8.0_211 PATH$PATH:$JAVA_HOME/bin [rootnexus ~]# source /etc/profile.d/java.sh 必须要选择与n…

UE5 伤害数字跳出

学习视频 大体思路: 1.创建一个控件蓝图。 播放动画,K透明度,文本位置。 2.创建一个控件组件。 类默认值中设置。 3.在位置处创建组件实例 自定义事件略。

汇编语言与接口技术——AD转换及PWM控制

一、 实验要求 实验目的: 掌握SPI总线的使用方式掌握xpt2046 AD转换芯片的工作原理掌握SPI总线方式实现基于xpt2046的AD转换掌握PWM控制功率的方式 实验内容: 学习xpt2046 AD转换芯片的工作原理,利用SPI总线实现基于该芯片的AD转换&#x…

idea使用谷歌翻译 有道翻译 百度翻译

中文版:文件——设置——工具——Translation,然后选择需要配置的翻译 英文版:File——settings——Tools——Translation,然后选择需要配置的翻译 谷歌翻译大家可以度娘直接搜索Google_translation_win 有道和百度翻译得去注册申…

什么是RoPE-旋转位置编码?

RoPE位置编码是大模型中最常见的位置编码之一。像是谷歌的PaLM和meta的LLaMA等开源大模型都是RoPE位置编码,那么RoPE有什么特点呢? 本文将介绍如下内容: RoPE旋转位置编码概要什么是位置编码?RoPE及其特点总结 一、RoPE旋转位置…

书生·浦语大模型实战营作业(四)

基础作业: 构建数据集,使用 XTuner 微调 InternLM-Chat-7B 模型, 让模型学习到它是你的智能小助手,效果如下图所示,本作业训练出来的模型的输出需要将不要葱姜蒜大佬替换成自己名字或昵称! 数据集 回答结果 进阶作…

Rsync远程同步,删除大量文件

目录 什么是文本传输? 文件传输工具: Rsync工具介绍 rsync的作用 命令格式 实验配置rsync源服务器 先检查是否有rsync工具 建立/etc/rsyncd.conf 配置文件 为备份账户创建数据文件 给数据文件添加权限 保证所有用户对源目录/var/www/html 都有读…

Android-跨进程

startService和bindService的区别,生命周期以及使用场景 startService: onCreate -> onStartCommand -> onDestory ,在多次调用startService的时候,onCreate不重复执行,但是onStartCommand会执行。startService调…

Vulnhub靶机:driftingblues 4

一、介绍 运行环境:Virtualbox 攻击机:kali(10.0.2.15) 靶机:driftingblues4(10.0.2.20) 目标:获取靶机root权限和flag 靶机下载地址:https://www.vulnhub.com/entr…