SQLAlchemy学习与使用
摘要SQLAlchemy是Python中最流行的ORM框架把数据库表映射成Python对象让你用操作对象的方式操作数据库不用手写SQL。本文从Engine、Session、Base讲到CRUD的完整实现。一、什么是SQLAlchemySQLAlchemy是Python中最流行的ORM框架。ORMObject-Relational Mapping把Python对象和数据库表对应起来类对应表、属性对应字段、实例对应一行数据。核心优势一套代码支持MySQL、PostgreSQL、SQLite、Oracle等主流数据库切换数据库只需改连接字符串不用改业务代码。二、核心概念SQLAlchemy分两层Core底层引擎和ORM上层映射。我们重点学ORM。Engine数据库连接的入口通过连接字符串创建决定了连什么数据库、用什么账号密码。Session和数据库交互的桥梁所有增删改查都通过Session完成。Base所有模型类的父类。继承Base的类会自动映射成数据库表。ModelPython类对应一张表。类属性对应表字段类实例对应一行数据。Column定义字段可指定类型、主键、非空、默认值等约束。三、快速开始安装依赖bashpip install sqlalchemy pymysql其他数据库驱动PostgreSQLpip install psycopg2-binarySQLitePython自带无需额外安装Oraclepip install cx_Oracle创建Engine连接数据库pythonfrom sqlalchemy import create_engine # 格式mysqlpymysql://用户名:密码主机:端口/数据库名 engine create_engine( mysqlpymysql://root:123456localhost:3306/sqlalchemy_demo, echoTrue # 打印生成的SQL调试用 )创建Base和Modelpythonfrom sqlalchemy.orm import declarative_base from sqlalchemy import Column, Integer, String, DateTime, Boolean from datetime import datetime Base declarative_base() class User(Base): __tablename__ user # 对应数据库表名 id Column(Integer, primary_keyTrue, autoincrementTrue, comment用户ID) username Column(String(50), nullableFalse, uniqueTrue, comment用户名) password Column(String(100), nullableFalse, comment密码) email Column(String(100), comment邮箱) is_active Column(Boolean, defaultTrue, comment是否激活) created_at Column(DateTime, defaultdatetime.now, comment创建时间)常用字段类型Integer整数、String(n)字符串、DateTime时间、Float浮点数、Boolean布尔常用约束primary_key主键、autoincrement自增、nullable非空、unique唯一、default默认值创建数据表python# 根据所有继承Base的模型创建表 Base.metadata.create_all(engine)执行后在数据库中看到user表。创建Sessionpythonfrom sqlalchemy.orm import sessionmaker SessionFactory sessionmaker(bindengine) session SessionFactory()用with自动管理关闭pythonwith SessionFactory() as session: # 操作数据库 pass四、CRUD操作Create新增pythonfrom sqlalchemy_config import SessionFactory from base_model import User with SessionFactory() as session: # 创建实例 new_user User( usernamezhangsan, password123456, emailzhangsanexample.com ) # 添加到会话 session.add(new_user) # 批量添加 session.add_all([ User(usernamelisi, password123456), User(usernamewangwu, password123456) ]) # 提交事务 session.commit()Read查询基础查询pythonwith SessionFactory() as session: # 查询全部 users session.query(User).all() # 查询第一条 user session.query(User).first() # 按条件查询 user session.query(User).filter(User.username zhangsan).first()条件查询python# 模糊查询用户名以zh开头 users session.query(User).filter(User.username.like(zh%)).all() # 多条件且 users session.query(User).filter( User.is_active True, User.id 5 ).all() # 多条件或 from sqlalchemy import or_ users session.query(User).filter( or_(User.username zhangsan, User.username lisi) ).all() # 范围查询id在2到5之间 users session.query(User).filter(User.id.between(2, 5)).all() # 包含用户名在列表中 users session.query(User).filter(User.username.in_([zhangsan, lisi])).all()排序和分页python# 升序 users session.query(User).order_by(User.id).all() # 降序 users session.query(User).order_by(User.id.desc()).all() # 分页跳过3条取2条 users session.query(User).offset(3).limit(2).all()分组和聚合pythonfrom sqlalchemy import func # 统计总数 count session.query(func.count(User.id)).scalar() # 按是否激活分组统计 results session.query( User.is_active, func.count(User.id).label(count) ).group_by(User.is_active).all()Update更新pythonwith SessionFactory() as session: # 单条更新查出来改属性 user session.query(User).filter(User.username zhangsan).first() if user: user.password new_password session.commit() # 批量更新 session.query(User).filter(User.username.like(w%)).update( {password: common_password} ) session.commit() # SQLAlchemy 2.0语法 from sqlalchemy import update stmt update(User).where(User.username.like(w%)).values( passwordsqlalchemy2.0_password ) session.execute(stmt) session.commit()Delete删除pythonwith SessionFactory() as session: # 单条删除 user session.query(User).filter(User.username wangwu).first() if user: session.delete(user) session.commit() # 批量删除 session.query(User).filter(User.id 3).delete() session.commit() # SQLAlchemy 2.0语法 from sqlalchemy import delete stmt delete(User).where(User.id 18) session.execute(stmt) session.commit()五、抽取通用配置项目中把配置抽出来统一管理避免到处写连接字符串。sqlalchemy_config.pypythonfrom sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, declarative_base # 连接配置 DATABASE_URL mysqlpymysql://root:123456localhost:3306/sqlalchemy_demo # 创建Engine engine create_engine(DATABASE_URL, echoFalse) # 创建Session工厂 SessionFactory sessionmaker(bindengine) # 创建Base Base declarative_base()base_model.pypythonfrom sqlalchemy import Column, Integer, String, DateTime, Boolean from sqlalchemy_config import Base from datetime import datetime class User(Base): __tablename__ user id Column(Integer, primary_keyTrue, autoincrementTrue) username Column(String(50), nullableFalse, uniqueTrue) password Column(String(100), nullableFalse) email Column(String(100)) is_active Column(Boolean, defaultTrue) created_at Column(DateTime, defaultdatetime.now)使用pythonfrom sqlalchemy_config import SessionFactory from base_model import User with SessionFactory() as session: users session.query(User).all() for u in users: print(u.username, u.email)六、常用字段类型和约束速查字段类型类型对应MySQL说明IntegerINT整数String(n)VARCHAR(n)变长字符串TextTEXT长文本DateTimeDATETIME日期时间FloatFLOAT浮点数BooleanTINYINT(1)布尔值字段约束参数说明primary_keyTrue主键autoincrementTrue自增nullableFalse非空uniqueTrue唯一default值默认值comment说明字段注释七、常见问题表已存在时会重复创建吗不会。Base.metadata.create_all(engine)会检查表是否存在已存在则跳过。Session用完后要关闭吗要。用with SessionFactory() as session自动管理或用完手动session.close()。修改数据后必须commit吗必须。增删改都要session.commit()才能同步到数据库。查询不需要。filter和filter_by有什么区别filter_by只能用于等值条件写法简单filter_by(usernamezhangsan)filter支持所有条件表达式更灵活filter(User.username zhangsan)

相关新闻

上海AI Lab提出MemHarness框架:像人类一样重构经验,显著提升LLM Agent决策能力

上海AI Lab提出MemHarness框架:像人类一样重构经验,显著提升LLM Agent决策能力

【导语:检索过往经验是增强LLM Agent决策能力的常见方法,但现有记忆增强Agent很少判断经验是否适配当前上下文,可能导致负面效果。上海AI Lab团队受人类调用记忆方式启发,提出“LLM Agent经验重构”框架MemHarness,性能…

2026/8/4 8:04:20 阅读更多 →
Spring Boot @ConditionalOnProperty注解:配置驱动Bean加载的实战指南

Spring Boot @ConditionalOnProperty注解:配置驱动Bean加载的实战指南

1. 项目概述:为什么我们需要ConditionalOnProperty在Spring Boot项目里,你有没有遇到过这样的场景:开发环境用的是一套配置,比如连接本地的H2内存数据库,日志级别是DEBUG;到了测试环境,配置换成…

2026/8/4 8:04:20 阅读更多 →
终极免费手机号码定位工具:快速查询电话号码归属地并在地图上精确定位

终极免费手机号码定位工具:快速查询电话号码归属地并在地图上精确定位

终极免费手机号码定位工具:快速查询电话号码归属地并在地图上精确定位 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitc…

2026/8/4 8:04:20 阅读更多 →

最新新闻

二叉搜索树(BST)原理与C++高效实现指南

二叉搜索树(BST)原理与C++高效实现指南

1. 二叉搜索树基础概念解析 二叉搜索树(Binary Search Tree,BST)是一种基于二叉树结构的高效数据组织形式,它完美体现了"分而治之"的算法思想。我在实际项目中多次使用BST来优化查询性能,其核心特性是&#…

2026/8/4 8:44:38 阅读更多 →
ESP32 ADC参数深度解析:从衰减器、位宽到采样周期的实战配置指南

ESP32 ADC参数深度解析:从衰减器、位宽到采样周期的实战配置指南

1. ESP32 ADC:从“能用”到“用好”的关键认知如果你正在用ESP32做项目,无论是测个电池电压、读个电位器角度,还是采集传感器模拟信号,ADC(模数转换器)这个外设大概率是你绕不开的一环。很多开发者&#xf…

2026/8/4 8:44:38 阅读更多 →
SPI Flash读写原理详解:从硬件时序到BIOS代码层面

SPI Flash读写原理详解:从硬件时序到BIOS代码层面

SPI Flash读写原理详解:从硬件时序到BIOS代码层面本文从PCH内存映射窗口讲到EDK2源码,把硬件时序和固件代码串成一条线。一、SPI Flash不是"硬盘"——它是内存映射窗口里的字节流 刚入行的同事盯着电路板问我:“师傅,BI…

2026/8/4 8:44:38 阅读更多 →
Unity 2D Spine角色光晕优化:从全屏后处理到精准Shader标记

Unity 2D Spine角色光晕优化:从全屏后处理到精准Shader标记

1. 项目概述:为什么2D Spine角色需要光晕效果优化?在Unity中处理2D Spine动画角色时,为其添加一个恰到好处的光晕(Bloom)效果,是提升视觉表现力、突出角色存在感、营造氛围的常用手段。无论是用于技能特效、…

2026/8/4 8:44:38 阅读更多 →
网络安全蜜罐部署与实战:从Docker环境搭建到攻击行为分析

网络安全蜜罐部署与实战:从Docker环境搭建到攻击行为分析

这次我们来看一个名为“回归蚁圈,体验蜜罐”的项目。从标题来看,这很可能是一个与网络安全、渗透测试或威胁情报相关的工具或平台。“蚁圈”通常指代网络安全爱好者或从业者社区,而“蜜罐”则是经典的主动防御技术,用于诱捕攻击者…

2026/8/4 8:44:38 阅读更多 →
小说智能推荐系统研究数据集

小说智能推荐系统研究数据集

选题背景随着数字阅读产业快速发展,网络文学已成为数字内容产业核心支柱,市场规模与用户群体持续扩大。当前,中国网络文学用户规模超6亿,小说作品存量达数百万部且日均新增可观,涵盖多种题材。海量内容供给与用户有限阅…

2026/8/4 8:43:38 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →