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/10/27 5:44:03 阅读更多 →
Spring Boot @ConditionalOnProperty注解:配置驱动Bean加载的实战指南

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

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

2026/10/24 13:41:48 阅读更多 →
终极免费手机号码定位工具:快速查询电话号码归属地并在地图上精确定位

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

终极免费手机号码定位工具:快速查询电话号码归属地并在地图上精确定位 【免费下载链接】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/10/25 13:32:06 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/26 12:00:21 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/26 4:52:12 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/26 12:00:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/26 5:00:37 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 12:00:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 13:21:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 8:34:37 阅读更多 →