SQLAlchemy 全面教程:常用 API 串联与实战指南

大家好,我是jobleap.cn的小九。
关于Python 的 SQLAlchemy 组件的核心用途、解决的问题,以及一套系统的实战教程,我会从核心价值到具体 API 再到实战案例,帮你全面掌握这个工具。

一、SQLAlchemy 核心定位:能做什么?解决什么问题?

1. 核心用途

SQLAlchemy 是 Python 中最流行的ORM(对象关系映射)框架,核心作用是将 Python 的对象模型与关系型数据库的表结构进行映射,让你可以用面向对象的方式操作数据库,无需直接编写复杂的 SQL 语句。

2. 解决的核心问题

  • 告别原生 SQL 硬编码:避免手写大量重复、易出错的 SQL,降低代码与数据库语法的耦合度。
  • 跨数据库兼容:一套代码可适配 MySQL、PostgreSQL、SQLite、Oracle 等主流数据库,切换数据库无需大幅修改代码。
  • 简化数据库操作:封装了数据库连接、事务、CRUD、关联查询等核心操作,提升开发效率。
  • 提升代码可读性:用 Python 类/对象代替 SQL 语句,代码更符合面向对象编程思维,易维护。
  • 安全防护:自动处理 SQL 注入问题,无需手动拼接参数。

二、环境准备

首先安装 SQLAlchemy 和数据库驱动(以 SQLite 为例,无需额外安装服务,适合入门):

pipinstallsqlalchemy# 若使用 MySQL,需额外安装驱动:pip install pymysql# 若使用 PostgreSQL:pip install psycopg2-binary

三、核心 API 解析与串联使用

1. 核心模块与关键 API 概览

模块/类作用
create_engine创建数据库引擎,管理数据库连接池
DeclarativeBase模型基类,所有数据表模型需继承此类
Column定义数据表字段
Integer/String/Boolean字段类型,映射数据库数据类型
Session会话类,用于执行数据库操作(增删改查)
select/insert/update/delete查询构建器,用于构建 SQL 操作语句

2. 基础实战:从建库到 CRUD

步骤 1:初始化引擎与模型定义
fromsqlalchemyimportcreate_engine,Column,Integer,String,Booleanfromsqlalchemy.ormimportDeclarativeBase,Session# 1. 定义模型基类(核心 API:DeclarativeBase)classBase(DeclarativeBase):pass# 2. 定义数据表模型(核心 API:Column + 字段类型)classUser(Base):# 表名__tablename__="users"# 字段定义:id(主键)、name、age、is_activeid=Column(Integer,primary_key=True,autoincrement=True)name=Column(String(50),nullable=False)# 非空字符串,长度50age=Column(Integer,default=0)# 默认值0is_active=Column(Boolean,default=True)# 布尔类型,默认活跃# 3. 创建数据库引擎(核心 API:create_engine)# SQLite 数据库文件:test.db(文件不存在则自动创建)engine=create_engine("sqlite:///test.db")# 4. 创建所有数据表(基于模型)Base.metadata.create_all(engine)
步骤 2:会话操作(增删改查)

会话(Session)是 SQLAlchemy 操作数据库的核心入口,所有 CRUD 都通过会话完成。

(1)新增数据(Create)
# 创建会话(绑定引擎)withSession(engine)assession:# 实例化模型 = 新增一条数据user1=User(name="张三",age=25)user2=User(name="李四",age=30,is_active=False)# 添加数据到会话session.add(user1)session.add_all([user2])# 批量添加# 提交事务(核心:必须提交才会写入数据库)session.commit()# 提交后可获取自动生成的主键 IDprint(f"新增用户1 ID:{user1.id}")print(f"新增用户2 ID:{user2.id}")
(2)查询数据(Read)
fromsqlalchemyimportselectwithSession(engine)assession:# ① 查询所有用户(核心 API:select)stmt=select(User)users=session.execute(stmt).scalars().all()# scalars() 提取模型对象print("所有用户:")foruserinusers:print(f"ID:{user.id}, 姓名:{user.name}, 年龄:{user.age}, 状态:{user.is_active}")# ② 条件查询(按ID查询)stmt=select(User).where(User.id==1)user=session.execute(stmt).scalar_one()# 确保只返回一条print(f"\nID=1 的用户:{user.name}")# ③ 多条件查询(年龄>25 且 活跃)stmt=select(User).where(User.age>25,User.is_active==True)active_users=session.execute(stmt).scalars().all()print(f"\n年龄>25的活跃用户:{[u.nameforuinactive_users]}")
(3)更新数据(Update)
withSession(engine)assession:# 1. 先查询要更新的对象stmt=select(User).where(User.name=="李四")user=session.execute(stmt).scalar_one()# 2. 直接修改对象属性user.age=31user.is_active=True# 3. 提交事务(自动更新)session.commit()print(f"更新后李四的信息:年龄={user.age},状态={user.is_active}")
(4)删除数据(Delete)
withSession(engine)assession:# 1. 先查询要删除的对象stmt=select(User).where(User.id==2)user=session.execute(stmt).scalar_one()# 2. 删除对象session.delete(user)# 3. 提交事务session.commit()print(f"已删除 ID={user.id}的用户")

3. 进阶 API:关联查询(一对多)

SQLAlchemy 核心优势之一是简化表关联,以下是「用户-订单」一对多关联的示例:

fromsqlalchemyimportForeignKeyfromsqlalchemy.ormimportrelationship# 定义订单模型(关联 User)classOrder(Base):__tablename__="orders"id=Column(Integer,primary_key=True,autoincrement=True)order_no=Column(String(20),nullable=False)# 订单号user_id=Column(Integer,ForeignKey("users.id"))# 外键关联用户表# 关联到 User 模型(反向关联:User.orders)user=relationship("User",back_populates="orders")# 给 User 模型添加反向关联User.orders=relationship("Order",back_populates="user",cascade="all, delete-orphan")# 重新创建数据表(新增 orders 表)Base.metadata.create_all(engine)# 新增用户+订单(关联插入)withSession(engine)assession:user=session.execute(select(User).where(User.name=="张三")).scalar_one()# 新增订单并关联用户order1=Order(order_no="ORD20260122001",user=user)order2=Order(order_no="ORD20260122002",user=user)session.add_all([order1,order2])session.commit()# 查询用户的所有订单(关联查询)withSession(engine)assession:user=session.execute(select(User).where(User.name=="张三")).scalar_one()print(f"\n张三的订单:")fororderinuser.orders:print(f"订单号:{order.order_no}")

四、核心场景:解决实际开发问题

1. 批量操作优化

# 批量插入100条数据(高效)withSession(engine)assession:users=[User(name=f"用户{i}",age=20+i)foriinrange(100)]session.add_all(users)session.commit()

2. 事务回滚(异常处理)

withSession(engine)assession:try:user=User(name="王五",age="非数字")# 故意传入错误类型session.add(user)session.commit()exceptExceptionase:# 发生异常时回滚事务session.rollback()print(f"插入失败,已回滚:{e}")

3. 原生 SQL 兼容(特殊场景)

若需执行复杂 SQL,可直接使用原生语句:

withSession(engine)assession:# 执行原生 SQLresult=session.execute("SELECT name, age FROM users WHERE age > :age",{"age":25})forrowinresult:print(f"姓名:{row.name},年龄:{row.age}")

总结

  1. 核心价值:SQLAlchemy 是 ORM 框架,用 Python 对象代替原生 SQL 操作数据库,解决跨库兼容、SQL 注入、代码耦合等问题。
  2. 核心 APIcreate_engine(引擎)、DeclarativeBase(模型基类)、Column(字段)、Session(会话)、select/insert(查询构建器)是最常用的核心接口。
  3. 核心流程:定义模型 → 创建引擎 → 会话操作(CRUD)→ 提交/回滚事务,是使用 SQLAlchemy 的基础范式。

掌握以上内容,你就能应对日常开发中 80% 的数据库操作场景,进阶可深入学习查询优化、索引、多表关联、异步操作等内容。

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

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

相关文章

LLM知识随笔(二)--BERT

LLM知识随笔(二)–BERT 文章目录 LLM知识随笔(二)--BERT一、BERT:公认的里程碑1. BERT与GPT之间的区别:2.单向编码与双向编码的区别 二、BERT的结构:强大的特征提取能力1.ELMo、GPT、BERT三者区…

2026 年百度竞价代运营公司排名公布:TOP3 权威测评来了!

2026 年百度竞价广告迎来全新规则升级,关键词竞价资产前置释放、AI 智能出价模型迭代、质量分考核维度更趋精细化,让粗放式投放彻底失去生存空间,企业想要靠百度竞价精准获客,选对专业的开户代运营服务商成为核心关…

AIGC论文助手:10款智能写作工具盘点

工具名称核心优势适用场景aicheck快速降AIGC率至个位数AIGC优化、重复率降低aibiye智能生成论文大纲论文结构与内容生成askpaper文献高效整合开题报告与文献综述秒篇降重效果显著重复率大幅降低一站式论文查重降重查重改写一站式完整论文优化深度AI降重深度改写保留原意文本结构…

显示器的宽高比一般是多少?什么是屏幕分辨率?常讲的2K 、4K和8K电视是什么含义?

显示器的宽高比指的是屏幕显示画面的宽度与高度的比值,通常以最简整数比的形式表示,标准化比例包括4:3(传统标准)、16:9(当前主流)和21:9(小众特殊比例),它决定了屏幕的整体形状,与分…

在Ubuntu上下载Questasim

仅为本人实操记录,旨在帮助遇到同样问题的友友们。本人小白,所以说的可能比较啰嗦。 用的是VMWare 17Pro,Ubuntu24.04,Questasim10.7c,也是跟着其他人的教程做的,但是过程中出现了很多问题,所以按照我解决之后的…

No.9 监理工作的组织和规划

监理工作的组织和规划 一、监理工作组织和规划总览 (一)核心意义 通俗解释 监理工作要想干得好,核心得抓两件事:一是“人要靠谱、分工明确”,二是“计划清晰、有章可循”。就像一支施工队,得先确定谁是…

十大AI论文神器:智能降重与高效写作指南

十大AI论文生成工具排行榜:AIGC降重,论文写作生成新选择 工具名称 核心优势 适用场景 aicheck 快速降AIGC率至个位数 AIGC优化、重复率降低 aibiye 智能生成论文大纲 论文结构与内容生成 askpaper 文献高效整合 开题报告与文献综述 秒篇 降…

TAOCP 1.2.1部分习题 - Ghost

TAOCP 1.2.1部分习题 T9 题目标记:[25] 题目: 试求下面式子的求和表达式,并予以证明: \[1^2 , 2^2 -1^2 , 3^2 -2^2 +1^2 , 4^2 -3^2 +2^2 -1^2 \]以下是分析: 手动计算几个,发现就是等差数列求和。 于是我们猜想…

论文降重利器:AI生成工具Top10推荐

工具名称核心优势适用场景aicheck快速降AIGC率至个位数AIGC优化、重复率降低aibiye智能生成论文大纲论文结构与内容生成askpaper文献高效整合开题报告与文献综述秒篇降重效果显著重复率大幅降低一站式论文查重降重查重改写一站式完整论文优化深度AI降重深度改写保留原意文本结构…

攻防世界baby_web

1.根据题目提示 题目提示初始界面 服务器通常会优先加载这些文件名作为初始页面:index.php、index.html、index.htm default.php、default.html home.php、home.html2.尝试 方法一 用dirsearch进行扫描可以发现存在in…

学长亲荐2026研究生必用AI论文网站TOP9:开题报告文献综述神器

学长亲荐2026研究生必用AI论文网站TOP9:开题报告文献综述神器 2026年研究生必备AI论文工具测评:精准定位你的学术好帮手 随着人工智能技术的不断进步,越来越多的研究生开始依赖AI工具来提升论文写作效率。然而,面对市场上琳琅满…

如何安全抓取SoundCloud数据用于音频 AI 模型训练?

音频 AI 训练模型对高质量、多样化的音频数据需求极高,而 SoundCloud 是全球最大的音频分享社区之一,包含数百万曲目和丰富的元数据,是进行音频分析、生成和增强等任务的理想来源。然而,由于 SoundCloud 的动态内容渲染、API 限制…

云服务器部署项目

一、配置环境法律文书生成与案例智能检索系统使用了ElasticSearch、Redis、MySQL、kkFileView。因此需要将这些组件在云服务器启动并配置到项目中。保证项目可以正确部署。1、首先在云服务器下载docker在云服务器下载docker之后,使用docker拉取所需的组件镜像并启动…

苏州服务器系统崩溃/卡在启动界面

序幕:产线的“心跳骤停” 周一清晨7点15分,“精工制造”一号车间的早班工人已全部就位,但整条智能生产线却一片死寂。控制中心的屏幕上,那台指挥着30台高端数控机床的MES服务器,正显示着一个令人绝望的画面&#xff1…

Ozon还是Joom?俄罗斯电商新手的平台选择全解析

选对平台,是你在俄罗斯市场挖到的第一桶金。近年来,俄罗斯电子商务市场展现出惊人的增长潜力,随着西方平台的撤离和本地数字生态的演进,这片广袤的土地正成为全球跨境卖家关注的新蓝海。在众多平台中,Ozon和Joom脱颖而…

吐血推荐!10款AI论文工具测评,本科生写论文太省力了

吐血推荐!10款AI论文工具测评,本科生写论文太省力了 2026年AI论文工具测评:为何值得一看? 随着人工智能技术的不断进步,越来越多的本科生开始依赖AI工具来提升论文写作效率。然而,面对市场上琳琅满目的AI论…

AS721低功耗交换芯片 搭CS5801互传HDMI DP/hdmi to dp双向互传

AS721是一款低功耗高性能无需外部电源的DP1.2/HDMI 2.0切换器。ASL721搭配国产芯片,集睿致远(ASL)CS5801可实现HDMI与DP信号的‌双向互转‌功能,成品已经过测试,可量产。 产品样板图: 1功能特性: 支持输…

2026 年 GEO 系统优化推广公司排名公布:TOP3 权威测评来了!

2026 年的互联网流量战场,已经从 “关键词时代” 全面进入 “AI 生成式搜索时代”。 GEO(生成式引擎优化)成为企业获取 AI 搜索流量的核心方式,谁能让 AI 优先推荐你的内容,谁就能抢占市场主动权。 但市场上 GEO …

揭秘!2026 年 GEO营销 系统优化推广公司/服务商 TOP3(权威评测)

2026 年生成式 AI 重构全球营销逻辑,GEO(生成式引擎优化)彻底取代传统 SEO,成为企业抢占 AI 搜索流量高地的核心抓手。据行业白皮书数据显示,国内 GEO 服务市场规模已突破 286 亿元,年增速超 70%,但行业内 “黑…

AI开发-python-langchain框架(1-4动态少样本提示)

这个代码的核心功能是:基于输入词的长度动态选择反义词示例,并调用大模型生成反义词,体现了 “动态少样本提示(Dynamic Few-Shot Prompting)” 与 “上下文长度感知的示例选择” 的能力。from langchain.prompts …