Python SQLAlchemy ORM 框架从入门到精通:核心概念与CRUD实战指南
什么是SQLAlchemySQLAlchemy是Python中最流行的ORM对象关系映射框架它让开发者可以用Python对象操作数据库无需直接编写SQL语句。核心优势跨数据库兼容支持MySQL、PostgreSQL、SQLite等灵活的查询方式强大的事务支持完善的ORM映射机制SQLAlchemy核心概念SQLAlchemy分为两大模块Core核心组件和ORM对象关系映射。Core核心组件Engine引擎管理数据库连接Session会话数据库操作的桥梁Base基类所有ORM模型类的父类Model模型Python类对应数据库表Column字段定义表的字段和约束ORM对象关系映射ORM将Python对象与数据库表进行映射。核心优势无需编写原生SQL降低学习成本代码与数据库解耦便于维护和迁移自动处理数据类型转换支持事务管理和关联查询快速开始环境准备1. 安装SQLAlchemy及MySQL驱动pipinstallsqlalchemy pymysql2. 创建数据库CREATEDATABASEsqlalchemy_demo;创建Engine连接数据库fromsqlalchemyimportcreate_engine# 连接字符串格式数据库驱动://用户名:密码主机:端口/数据库名db_urlmysqlpymysql://root:123456localhost:3306/sqlalchemy_demoenginecreate_engine(db_url,echoTrue)# echoTrue打印SQL方便调试创建Base基类和Model模型fromsqlalchemy.ext.declarativeimportdeclarative_basefromsqlalchemyimportColumn,Integer,String,DateTimefromdatetimeimportdatetime# 创建Base基类Basedeclarative_base()# 定义User模型类classUser(Base):__tablename__user# 表名idColumn(Integer,primary_keyTrue,autoincrementTrue)usernameColumn(String(50),nullableFalse,uniqueTrue)passwordColumn(String(100),nullableFalse)create_timeColumn(DateTime,defaultdatetime.now)def__repr__(self):returnfUser(id{self.id}, username{self.username})创建数据表# 根据模型类自动创建表Base.metadata.create_all(engine)print(数据库表创建成功)创建Session实现数据库操作fromsqlalchemy.ormimportsessionmaker# 创建Session工厂SessionFactorysessionmaker(bindengine)# 插入数据sessionSessionFactory()userUser(usernamezhangsan,password123456)session.add(user)session.commit()session.close()# 查询数据sessionSessionFactory()all_userssession.query(User).all()foruinall_users:print(u)session.close()WHERE username ! ‘zhangsan’user2 session.query(User).filter(User.username ! “zhangsan”).all()print(f’{user2}‘)# 3. 模糊查询like对应 MySQL 的 WHERE username LIKE ‘%a%’user3 session.query(User).filter(User.username.like(“%a%”)).all()print(f’{user3}‘)# 4. 范围查询in_对应 MySQL 的 WHERE id IN (1,2,3)user4 session.query(User).filter(User.id.in_([1, 2, 3])).all()print(f’{user4}‘)# 5. 大于、小于、大于等于、小于等于user5 session.query(User).filter(User.id 2).all() # 对应 WHERE id 2print(f’{user5})# 6. 多条件查询and_ / or_对应 MySQL 的 AND / ORfrom sqlalchemy import and_, or_# 对应 WHERE id 1 AND username LIKE w% user6 session.query(User).filter(and_(User.id 1, User.username.like(w%))).first() print(f{user6}) # 对应 WHERE usernamezhangsan AND password123456 user7 session.query(User).filter_by(usernamezhangsan, password123456).first() print(f{user7}) # 对应 WHERE id 1 OR username LIKE w% user8 session.query(User).filter(or_(User.id 1, User.username.like(w%))).all() print(f{user8})#### 排序、分页查询 python from sqlalchemy_config import SessionFactory from base_model import User #导入Model模型 with SessionFactory() as session: # 1. 排序order_by对应 MySQL 的 ORDER BY users_asc session.query(User).order_by(User.id).all() # 按 id 升序默认对应 ORDER BY id ASC users_desc session.query(User).order_by(User.id.desc()).all() # 按 id 降序对应 ORDER BY id DESC print(f{users_asc}) print(f{users_desc}) # 2. 分页limit offset对应 MySQL 的 LIMIT 和 OFFSET适合分页查询 page 2 # 第 2 页 page_size 2 # 每页 2 条数据 # 对应 SELECT * FROM user ORDER BY id LIMIT 2 OFFSET 2 users_page session.query(User).order_by(User.id).limit(page_size).offset((page - 1) * page_size).all() print(f{users_page}) # 3. 统计数量count对应 MySQL 的 COUNT(*) user_count session.query(User).filter(User.username.like(z%)).count() print(f{user_count})分组查询函数作用func.count(字段)统计数量func.sum(字段)求和func.avg(字段)平均值func.max(字段)最大值func.min(字段)最小值fromsqlalchemy_configimportsessionFactory,funcfromsqlalchemyimportselectfrombase_modelimportUser,Accountwith(sessionFactory()assession):# 1.简单分组查询# 因为聚合函数是数据库提供的函数 所以需要导入func# 默认query(Account)查询所有列 聚合查询只能查询分组列与聚合函数所以# 所以需要查询指定列group1session.query(Account.age,func.count(Account.id)).group_by(Account.age).all()print(group1)# 聚合比较特殊 不会返回对应的对象 所以默认以元组返回# 如果想以字典形式返回需要使用新版2.0 API然后使用.mappings()stmtselect(Account.age,func.count(Account.id).label(count)).group_by(Account.age)group2session.execute(stmt).mappings().all()print(group2)# 2.having分组筛选# 可以直接使用having()进行分组的筛选group3session.query(Account.age,func.count(Account.id)).group_by(Account.age).having(func.count(Account.id)1).all()print(group3)stmtselect(Account.age,func.count(Account.id).label(count)).group_by(Account.age).having(func.count(Account.id)1)group4session.execute(stmt).mappings().all()print(group4)Create新增数据新增数据的步骤创建模型实例 → 将实例添加到会话 → 提交会话commit新增后的数据会直接写入 MySQL 数据库。fromsqlalchemy_configimportSessionFactoryfrombase_modelimportUser#导入Model模型withSessionFactory()assession:# 创建User实例相当于创建一条数据user1User(usernamelisi2,password123456)user2User(usernamewangwu2,password654321)# 1. 将实例添加到Session相当于“暂存”数据未提交到数据库session.add(user1)session.add(user2)# 提交事务将暂存的数据提交到数据库此时才会真正插入数据session.commit()# 2. 批量添加可选session.add_all([user1,user2])session.commit()# 3. 批量字典添加# 准备字典列表不用创建User对象user_dicts[{username:sunqi,password:123123},{username:zhouba,password:456456},{username:wujiu,password:789789},]# 4. 批量插入session.bulk_insert_mappings(User,user_dicts)session.commit()# 5. sqlalchemy2.0语法fromsqlalchemyimportinsert# 构建insert语句stmtinsert(User).values([{username:zhengshi,password:aaa},{username:chenshi,password:bbb},])# 执行语句session.execute(stmt)session.commit()Delete删除数据删除数据的步骤查询数据 → 删除实例 → 提交会话删除操作会直接删除 MySQL 中的对应数据。fromsqlalchemy_configimportSessionFactoryfrombase_modelimportUser#导入Model模型fromsqlalchemyimportdeletewithSessionFactory()assession:# 1. 单条数据删除usersession.query(User).filter(User.usernamewangwu).first()ifuser:session.delete(user)# 对应 DELETE FROM user WHERE username wangwusession.commit()# 2. 批量删除对应 MySQL 的 DELETE ... WHERE ...# 删除所有 id 3 的用户session.query(User).filter(User.id3).delete()session.commit()# 3. sqlalchemy2.0语法fromsqlalchemyimportdelete# 构建 delete 语句stmtdelete(User).where(User.id18)# 执行语句session.execute(stmt)session.commit()Update更新数据更新数据的步骤查询数据 → 修改实例属性 → 提交会话更新操作会直接同步到 MySQL 数据库。fromsqlalchemy_configimportSessionFactoryfrombase_modelimportUser#导入Model模型withSessionFactory()assession:# 1. 单条数据更新usersession.query(User).filter(User.usernamezhangsan).first()ifuser:user.passwordnew_password123# 修改密码对应 UPDATE user SET password new_password123session.commit()# 提交更新print(f{user})# 2. 批量更新高效对应 MySQL 的 UPDATE ... WHERE ...# 将所有用户名以 w 开头的用户密码更新为 common_passwordsession.query(User).filter(User.username.like(w%)).update({password:common_password})session.commit()# 3. sqlalchemy2.0语法fromsqlalchemyimportupdate# 构建 update 语句stmtupdate(User).where(User.username.like(w%)).values(passwordsqlalchemy2.0_password)# 执行语句session.execute(stmt)session.commit()

相关新闻

SpringBoot+Vue高校实习管理系统全栈开发实践

SpringBoot+Vue高校实习管理系统全栈开发实践

1. 项目概述高校实习管理系统是连接学校、学生和企业的重要桥梁。2025年最新版的这套基于SpringBootVue的全栈解决方案,采用了当前最主流的技术栈组合:后端SpringBoot 3.2 MyBatis-Plus 3.6 MySQL 8.0,前端Vue 3.3 Element Plus 2.4&#…

2026/8/4 4:26:46 阅读更多 →
Unity3D嵌入浏览器插件选型与实战:实现Web与3D引擎深度融合

Unity3D嵌入浏览器插件选型与实战:实现Web与3D引擎深度融合

1. 项目概述:为什么Unity需要嵌入浏览器?在Unity3D项目中直接嵌入一个完整的浏览器视图,听起来像是一个“跨界”的需求,但它的应用场景远比想象中要广泛。我最早接触这个需求,是源于一个工业仿真项目。客户希望能在3D虚…

2026/8/4 4:26:46 阅读更多 →
VMware Ubuntu网络问题排查与NAT模式配置指南

VMware Ubuntu网络问题排查与NAT模式配置指南

1. 问题现象与初步排查最近在VMware Workstation上安装Ubuntu 22.04 LTS时遇到了典型的网络连接问题——虚拟机内的Ubuntu系统无法访问互联网,而宿主机网络正常。这种问题在虚拟化环境中相当常见,尤其对于刚接触Linux系统的新手。通过ifconfig命令查看时…

2026/8/4 4:26:46 阅读更多 →

最新新闻

MAA明日方舟助手:解放双手的智能游戏管家,一键完成全部日常任务

MAA明日方舟助手:解放双手的智能游戏管家,一键完成全部日常任务

MAA明日方舟助手:解放双手的智能游戏管家,一键完成全部日常任务 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项…

2026/8/4 11:07:13 阅读更多 →
量化交易中的月末效应策略优化与回测分析

量化交易中的月末效应策略优化与回测分析

1. 月末策略标的回测再研究:量化交易中的关键优化路径做量化交易的朋友都知道,月末效应是市场中的一个典型现象。每到月底,机构调仓、资金流动、业绩考核等因素交织,往往会产生特定的市场波动模式。我从业内几家头部私募的朋友那里…

2026/8/4 11:07:13 阅读更多 →
京东抢购助手:5分钟配置,告别手慢无的终极解决方案

京东抢购助手:5分钟配置,告别手慢无的终极解决方案

京东抢购助手:5分钟配置,告别手慢无的终极解决方案 【免费下载链接】jd-assistant 京东抢购助手:包含登录,查询商品库存/价格,添加/清空购物车,抢购商品(下单),查询订单等功能 项目地址: http…

2026/8/4 11:07:13 阅读更多 →
定投10年从1W定投到100W基金投资复盘03-今日组合定投复盘

定投10年从1W定投到100W基金投资复盘03-今日组合定投复盘

持仓记录第7天,当前持仓金额:10114.52元,盈亏:98.62元,持仓收益:0.98%。 市场估值星级4.3星。 目前我的资金还少,正好可以做个定投实验,文末有我的腾讯在线文档链接,大…

2026/8/4 11:07:13 阅读更多 →
健身房智慧场馆管理小程序开发公司排名,私教约课系统

健身房智慧场馆管理小程序开发公司排名,私教约课系统

健身房智慧场馆管理小程序开发公司排名,私教约课系统随着健身行业数字化转型加速,传统健身房依赖人工登记、微信预约、纸质台账的运营模式,已经无法适配现代场馆的精细化管理需求。智慧场馆管理小程序搭配专业私教约课系统,成为健…

2026/8/4 11:07:13 阅读更多 →
番茄小说下载器:5分钟打造个人数字图书馆的终极方案

番茄小说下载器:5分钟打造个人数字图书馆的终极方案

番茄小说下载器:5分钟打造个人数字图书馆的终极方案 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 还在为找不到心仪的小说资源而烦恼吗?想要轻松将网…

2026/8/4 11:06:13 阅读更多 →

日新闻

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 阅读更多 →