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

Python中的SQL数据库管理:SQLAlchemy教程


Python中的SQL数据库管理:SQLAlchemy教程

在Python应用程序中,操作数据库是常见的需求之一。而 SQLAlchemy 是一个功能强大的数据库管理库,它提供了Pythonic的接口来管理和查询SQL数据库。SQLAlchemy 兼具 ORM(对象关系映射)和核心 SQL 表达式构建功能,让用户既能享受面向对象的操作,也能灵活地编写复杂的 SQL 查询。本文将带您一步步了解 SQLAlchemy 的使用方式和常用技巧,帮助您在Python中高效管理SQL数据库。

一、SQLAlchemy 简介

SQLAlchemy 可以分为两个主要部分:

  • SQLAlchemy Core:一个轻量级的SQL表达式语言,支持基本的SQL查询构建。
  • SQLAlchemy ORM:基于对象关系映射的ORM库,允许我们将数据库表与Python对象关联,通过操作对象来操作数据库表。

安装 SQLAlchemy

要使用 SQLAlchemy,首先确保安装最新版本:

pip install sqlalchemy

二、创建数据库引擎

SQLAlchemy 的数据库连接是通过 Engine 对象实现的。连接数据库时,只需提供数据库URL,SQLAlchemy 将会自动选择相应的数据库驱动。

from sqlalchemy import create_engine# SQLite 示例数据库
engine = create_engine('sqlite:///example.db')

常见的数据库URL格式

  • SQLite: sqlite:///example.db
  • PostgreSQL: postgresql://username:password@localhost:5432/mydatabase
  • MySQL: mysql+pymysql://username:password@localhost/mydatabase

三、定义表结构

1. 使用 SQLAlchemy Core 定义表

可以通过 Table 对象定义表结构,包含表名、字段类型和主键等信息:

from sqlalchemy import MetaData, Table, Column, Integer, Stringmetadata = MetaData()users = Table('users', metadata,Column('id', Integer, primary_key=True),Column('name', String, nullable=False),Column('age', Integer)
)

2. 使用 ORM 定义表和模型

SQLAlchemy ORM 允许我们用 Python 类表示数据库中的表,定义一个模型类并继承 Base,通过字段类型定义表的结构。

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, StringBase = declarative_base()class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String, nullable=False)age = Column(Integer)# 创建所有定义的表
Base.metadata.create_all(engine)

四、建立会话并操作数据库

要操作数据库,需要通过 Session 对象与数据库交互。Session 提供了事务管理的功能,是 ORM 的核心部分。

from sqlalchemy.orm import sessionmaker# 创建Session类
Session = sessionmaker(bind=engine)
session = Session()

1. 插入数据

通过 ORM 模型实例化对象后,可以使用 session.add()session.add_all() 插入一条或多条数据。

# 创建一个新用户
new_user = User(name="Alice", age=25)
session.add(new_user)
session.commit()  # 提交更改

2. 查询数据

SQLAlchemy 提供了多种查询方法,如 query()filter() 等,让我们可以方便地进行各种复杂查询。

# 查询所有用户
users = session.query(User).all()
for user in users:print(user.name, user.age)# 查询单个用户
user = session.query(User).filter_by(name="Alice").first()
print(user.name, user.age)

3. 更新数据

通过查询获取对象后,直接修改对象的属性并提交即可完成更新。

user = session.query(User).filter_by(name="Alice").first()
user.age = 30
session.commit()

4. 删除数据

使用 session.delete() 删除数据,删除后需要提交更改。

user = session.query(User).filter_by(name="Alice").first()
session.delete(user)
session.commit()

五、高级查询技巧

SQLAlchemy 提供了丰富的查询 API,支持复杂查询操作,例如排序、分组、连接等。

1. 排序和限制

可以使用 order_by()limit() 方法实现结果排序和限制结果数量。

# 按年龄降序排序,获取前 5 个用户
users = session.query(User).order_by(User.age.desc()).limit(5).all()

2. 分组查询

可以使用 group_by() 实现分组查询,并结合 func 模块进行聚合计算。

from sqlalchemy import func# 查询每个年龄段的用户数量
age_count = session.query(User.age, func.count(User.id)).group_by(User.age).all()

3. 多表连接查询

在多表关联查询中,可以使用 join() 函数连接表,例如通过用户 ID 在 orders 表中查找用户订单。

# 假设有一个 Orders 表,我们可以通过 User 表和 Orders 表的关系进行连接查询
orders = session.query(User, Order).join(Order, User.id == Order.user_id).all()

六、使用事务管理

在 SQLAlchemy 中,事务是通过 Session 管理的。操作数据时可以使用 commit() 提交事务,也可以使用 rollback() 回滚事务。在批量操作数据时,通常使用事务块来确保操作的原子性。

# 开启事务
try:user = User(name="Bob", age=22)session.add(user)session.commit()
except Exception as e:session.rollback()  # 出错时回滚事务print(f"发生错误: {e}")
finally:session.close()

七、模型间关系管理

在 ORM 中,我们可以通过关系(relationship)来定义模型之间的关联,如一对多或多对多关系。SQLAlchemy 提供了 relationship() 方法进行关联映射。

1. 一对多关系

假设我们有一个 UserPost 表,每个用户可以有多个帖子,可以定义一对多的关系。

from sqlalchemy.orm import relationshipclass Post(Base):__tablename__ = 'posts'id = Column(Integer, primary_key=True)title = Column(String, nullable=False)user_id = Column(Integer, ForeignKey('users.id'))user = relationship("User", back_populates="posts")class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String, nullable=False)age = Column(Integer)posts = relationship("Post", back_populates="user")

2. 多对多关系

假设有一个 StudentCourse 表,可以使用 association_table 创建中间表来定义多对多的关系。

association_table = Table('student_course', Base.metadata,Column('student_id', Integer, ForeignKey('students.id')),Column('course_id', Integer, ForeignKey('courses.id'))
)class Student(Base):__tablename__ = 'students'id = Column(Integer, primary_key=True)name = Column(String)courses = relationship("Course", secondary=association_table, back_populates="students")class Course(Base):__tablename__ = 'courses'id = Column(Integer, primary_key=True)title = Column(String)students = relationship("Student", secondary=association_table, back_populates="courses")

八、总结

SQLAlchemy 是一个功能强大的数据库管理库,为 Python 开发者提供了操作 SQL 数据库的高效方式。通过 SQLAlchemy,您可以轻松地进行表定义、数据插入、复杂查询、事务管理和关系管理等操作。本教程涵盖了 SQLAlchemy 的基础与进阶使用方法,希望对您在实际开发中的数据库管理有所帮助。

相关文章:

Python中的SQL数据库管理:SQLAlchemy教程

Python中的SQL数据库管理:SQLAlchemy教程 在Python应用程序中,操作数据库是常见的需求之一。而 SQLAlchemy 是一个功能强大的数据库管理库,它提供了Pythonic的接口来管理和查询SQL数据库。SQLAlchemy 兼具 ORM(对象关系映射&…...

LeetCode --- 421周赛

题目列表 3334. 数组的最大因子得分 3335. 字符串转换后的长度 I 3336. 最大公约数相等的子序列数量 3337. 字符串转换后的长度 II 一、数组的最大因子得分 数据范围足够小,可以用暴力枚举移除的数字,得到答案,时间复杂度为O(n^2)&#…...

简单了解前缀树/字典树(Trie树)C++代码

介绍Trie树 Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补全和拼写检查。 前缀树也有一些其它的名称:字典…...

ubuntu安装与配置Nginx(2)

1. 配置 Nginx Nginx 的配置文件通常位于 /etc/nginx/nginx.conf,而虚拟主机的配置文件通常在 /etc/nginx/sites-available/ 和 /etc/nginx/sites-enabled/ 目录中。 在/etc/nginx/conf.d目录下新建xx.conf文件,配置文件, nginx -t 检查语法…...

Linux环境下Mongodb部署

文章目录 一、系统环境二、MongoDb安装添加MongoDB官方库安装MongoDB配置MongoDB 三、MongoDB常见操作四、MongoDB用户管理创建用户修改密码删除用户 五、启用安全控制六、备份与还原1. 备份2. 恢复 七、外部工具连接MongoDB 一、系统环境 CentOS Stream 9 64bit 二、MongoD…...

(九)JavaWeb后端开发——Servlet

目录 1.Servlet由来 2.Servlet快速入门 3.Servlet执行原理 4.Servlet生命周期 1.Servlet由来 在JaveEE API文档中对Servlet的描述是:可以运行在服务器端的微小程序,但是实际上,Servlet就是一个接口,定义了Java类被浏览器访问…...

【零售和消费品&家居用品】家庭门窗开闭状态安全监控系统源码&数据集全套:改进yolo11-DCNV2

改进yolo11-GhostDynamicConv等200全套创新点大全:家庭门窗开闭状态安全监控系统源码&数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.01 注意:由于项目一直在更新迭代,上面“1.图片效果展示”和“2.视频效果展示”…...

【JavaScript】axios 二次封装拦截器(接口、实例、全局)

学习 coderwhy 老师结合 ts 二次封装 axios 目录结构 config config\index.ts // export const BASE_URL "http://codercba.com:9002"; export const TIME_OUT 10000;// 1. 根据环境变量区分接口地址 // let BASE_URL: string; // if (process.env.NODE_ENV &qu…...

Linux_02 Linux常用软件——vi、vim

vi编辑器有三种主要模式,每种模式的功能和用途不同: 一、命令模式 (Command Mode): - 启动 vi 时默认进入此模式。 - 你可以在此模式下移动光标,输入各种命令(如删除、复制、粘贴等)。 yy:…...

C++代码优化--要求或禁止在堆中产生对象

目录 1.引言 2.栈与堆区别 2.1. 栈(Stack) 2.2. 堆(Heap) 3.限制在堆上分配内存的好处 4.对象在栈上分配内存的方法 4.1. 使用RAII(资源获取即初始化) 4.2. 避免使用new和delete 4.3. 限制对象的生…...

MybatisPlus入门(六)MybatisPlus-空值处理

一、MybatisPlus-空值处理 1.1)问题引入: 在查询中遇到如下情况,有部分筛选条件没有值,如商品价格有最大值和最小值,商品价格部分时候没有值。 1.2)解决办法: 步骤一:新建查询实体…...

钉钉内集成第三方免密登录(Vue+.Net)

需要实现的效果就是在钉钉内点击应用能跳转到第三方网站并且免密登录 1.登录钉钉PC端管理后台 2.通过管理后台进去开发者后台 3.应用开发 创建H5微应用 4.应用创建成功后直接点权限管理全部授权 5.设置H5登录地址 6. 应用管理发布 至此需要配置的步骤全部已完成,…...

卷积神经网络实验三:模型优化(1)

作者有话说: 这篇文章写的还是比混乱的。因为本人也是第一次做这样的尝试,虽然接触深度学习有一年了,但是对于模型的优化仅仅是局限于理论上。通过这一次的实验,我对于模型的理解也更深了几分。我不期望这篇文章能帮你能解决多大问…...

STM32F103的CAN通讯接收测试

首先配置CUBEMX 1.打开CUBEMX 设置时钟,由于我没有外部时钟,所以我选择内部时钟,选择8倍频,1分频,APB1时钟频率为32MKHZ,也就是说每秒能够执行 3200 万个时钟周期,1M是每秒执行100万个时钟周期。 2.CAN收…...

【Rust中的智能指针】

Rust中的智能指针 什么是智能指针?什么是Rust中的智能指针?Rust中的智能指针BoxBox的使用场景 Rust中的智能指针Rc与Arcrust中的RefCellrefcell的缺点:rust中的weak先来看看C中的weak_ptr定义代码示例: Deref和Drop 总结 什么是智…...

基于深度学习的社交网络中的社区检测

在社交网络分析中,社区检测是一项核心任务,旨在将网络中的节点(用户)划分为具有高内部连接密度且相对独立的子群。基于深度学习的社区检测方法,通过捕获复杂的网络结构信息和节点特征,在传统方法基础上实现…...

【Python基础】

一、编程语言介绍 1、分类 机器语言 (直接用 0 1代码编写)汇编语言 (英文单词替代二进制指令)高级语言 2、总结 1、执行效率:机器语言>汇编语言>高级语言(编译型>解释型) 2、开发效率&…...

【玉米叶部病害识别】Python+深度学习+人工智能+图像识别+CNN卷积神经网络算法+TensorFlow

一、介绍 玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集(‘矮花叶病’, ‘健康’, ‘灰斑病一般’, ‘灰斑病严重’, ‘锈病一般’, ‘锈病严重’, ‘叶斑病一般’, ‘叶斑病严重’&#x…...

【设计模式】如何用C++实现依赖倒置

【设计模式】如何用C实现依赖倒置 一、什么是依赖倒置? 依赖倒置原则(Dependency Inversion Principle,DIP)是SOLID面向对象设计原则中的一项。它的核心思想是: 高层模块不应该依赖于低层模块,两者都应该…...

使用onnxruntime-web 运行yolov8-nano推理

ONNX(Open Neural Network Exchange)模型具有以下两个特点促成了我们可以使用onnxruntime-web 直接在web端上运行推理模型,为了让这个推理更直观,我选择了试验下yolov8 识别预览图片: 1. 跨平台兼容性 ONNX 是一种开…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

ES6从入门到精通:前言

ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...