Python连接MySQL:PyMySQL入门与实践指南

发布时间:2026/9/12 8:18:05

Python连接MySQL:PyMySQL入门与实践指南 1. PyMySQL基础入门与安装指南PyMySQL是Python3中用于连接MySQL数据库的纯Python驱动库它实现了Python数据库API规范2.0版本。与Python2时代广泛使用的MySQLdb不同PyMySQL完全用Python编写不需要编译任何C扩展模块这使得它在跨平台部署时更加方便。1.1 PyMySQL的核心特性PyMySQL具有以下几个显著特点纯Python实现无需编译安装支持Python3Python2可使用MySQLdb实现了Python DB API 2.0规范支持SSL安全连接包含连接池支持兼容大多数MySQL特性包括存储过程、事务等在实际项目中我发现PyMySQL相比其他MySQL连接器有几个优势首先它的安装过程非常简单特别是对于没有编译环境的Windows用户其次它的错误信息更加友好调试起来更方便最后由于是纯Python实现可以方便地查看源码理解内部机制。1.2 安装PyMySQL的多种方式安装PyMySQL最常用的方式是通过pippip install pymysql如果你需要安装特定版本可以指定版本号pip install pymysql1.0.2在某些特殊环境下可能需要从源码安装。这时可以克隆GitHub仓库git clone https://github.com/PyMySQL/PyMySQL cd PyMySQL python setup.py install注意从源码安装需要确保系统已安装setuptools。如果遇到ImportError: No module named setuptools错误需要先安装setuptools。在Linux系统上可以通过以下命令安装setuptoolswget https://bootstrap.pypa.io/ez_setup.py python ez_setup.py2. 数据库连接与基本操作2.1 建立数据库连接使用PyMySQL连接MySQL数据库的基本代码如下import pymysql # 创建数据库连接 connection pymysql.connect( hostlocalhost, # 数据库服务器地址 userusername, # 数据库用户名 passwordpassword, # 数据库密码 databasedbname, # 数据库名 port3306, # 端口默认为3306 charsetutf8mb4, # 字符集 cursorclasspymysql.cursors.DictCursor # 使用字典游标 ) try: with connection.cursor() as cursor: # 执行SQL查询 sql SELECT * FROM users WHERE id %s cursor.execute(sql, (1,)) # 获取查询结果 result cursor.fetchone() print(result) finally: # 关闭连接 connection.close()在实际项目中我建议将数据库连接信息存储在配置文件中而不是硬编码在代码里。这样可以方便地在不同环境开发、测试、生产之间切换。2.2 使用上下文管理器简化连接管理Python的with语句可以简化连接管理确保连接在使用后被正确关闭。我们可以封装一个数据库上下文管理器import pymysql from contextlib import contextmanager contextmanager def get_db_connection(): conn pymysql.connect( hostlocalhost, useruser, passwordpass, databasedb, charsetutf8mb4, cursorclasspymysql.cursors.DictCursor ) try: yield conn finally: conn.close() # 使用示例 with get_db_connection() as conn: with conn.cursor() as cursor: cursor.execute(SELECT * FROM products) results cursor.fetchall() for row in results: print(row)这种写法不仅代码更简洁而且能确保在任何情况下包括发生异常时数据库连接都会被正确关闭避免资源泄漏。3. 执行SQL查询与事务处理3.1 基本CRUD操作PyMySQL支持所有标准的SQL操作包括增删改查CRUD。下面是一些常见操作的示例查询数据with connection.cursor() as cursor: # 查询单条记录 cursor.execute(SELECT * FROM users WHERE id %s, (1,)) user cursor.fetchone() # 查询多条记录 cursor.execute(SELECT * FROM users WHERE status %s, (active,)) active_users cursor.fetchall() # 获取记录数量 cursor.execute(SELECT COUNT(*) FROM users) user_count cursor.fetchone()[COUNT(*)]插入数据try: with connection.cursor() as cursor: sql INSERT INTO users (name, email) VALUES (%s, %s) cursor.execute(sql, (John Doe, johnexample.com)) # 提交事务 connection.commit() except: # 发生错误时回滚 connection.rollback() raise更新数据try: with connection.cursor() as cursor: sql UPDATE users SET name %s WHERE id %s cursor.execute(sql, (John Smith, 1)) print(f更新了{cursor.rowcount}条记录) connection.commit() except: connection.rollback() raise删除数据try: with connection.cursor() as cursor: sql DELETE FROM users WHERE id %s cursor.execute(sql, (1,)) connection.commit() except: connection.rollback() raise3.2 事务处理MySQL支持事务PyMySQL也提供了完整的事务支持。事务的四个特性ACID是原子性Atomicity事务中的所有操作要么全部完成要么全部不完成一致性Consistency事务执行前后数据库从一个一致状态变为另一个一致状态隔离性Isolation多个事务并发执行时一个事务的执行不应影响其他事务持久性Durability事务一旦提交其结果就是永久性的在PyMySQL中默认情况下每个SQL语句都会自动提交。要使用事务需要先关闭自动提交connection pymysql.connect( hostlocalhost, useruser, passwordpass, databasedb, autocommitFalse # 关闭自动提交 ) try: with connection.cursor() as cursor: # 执行多个SQL语句 cursor.execute(UPDATE accounts SET balance balance - 100 WHERE id 1) cursor.execute(UPDATE accounts SET balance balance 100 WHERE id 2) # 手动提交事务 connection.commit() except: # 发生错误时回滚 connection.rollback() raise finally: connection.close()在实际项目中我发现事务的正确使用非常重要。特别是在处理金融交易、库存管理等场景时一定要确保事务的完整性和一致性。4. 高级特性与最佳实践4.1 批量操作与参数化查询PyMySQL支持批量插入和更新操作这可以显著提高性能# 批量插入 data [ (John, johnexample.com), (Jane, janeexample.com), (Bob, bobexample.com) ] with connection.cursor() as cursor: sql INSERT INTO users (name, email) VALUES (%s, %s) cursor.executemany(sql, data) connection.commit()参数化查询不仅可以防止SQL注入还能提高性能因为MySQL可以缓存编译后的语句# 不安全的写法容易受到SQL注入攻击 cursor.execute(SELECT * FROM users WHERE id user_input) # 安全的参数化查询 cursor.execute(SELECT * FROM users WHERE id %s, (user_input,))4.2 错误处理与异常管理PyMySQL定义了多种数据库操作相关的异常合理的错误处理可以使程序更加健壮try: with connection.cursor() as cursor: cursor.execute(SELECT * FROM non_existent_table) except pymysql.err.ProgrammingError as e: print(fSQL语法错误: {e}) except pymysql.err.OperationalError as e: print(f数据库操作错误: {e}) except Exception as e: print(f其他错误: {e})常见的PyMySQL异常包括ProgrammingErrorSQL语法错误OperationalError数据库操作错误如连接失败IntegrityError完整性约束错误如重复键DataError数据处理错误如数据超出范围4.3 连接池与性能优化对于高并发应用频繁创建和关闭数据库连接会影响性能。可以使用连接池来管理数据库连接from pymysql import pools # 创建连接池 pool pools.Pool( hostlocalhost, useruser, passwordpass, databasedb, min2, # 最小连接数 max10, # 最大连接数 autocommitFalse ) # 从连接池获取连接 connection pool.connection() try: with connection.cursor() as cursor: cursor.execute(SELECT * FROM users) results cursor.fetchall() finally: # 将连接返回连接池 connection.close()其他性能优化建议合理使用索引加速查询避免在循环中执行SQL语句只查询需要的列避免SELECT *对于大量数据考虑使用分页查询4.4 使用ORM与PyMySQL结合虽然PyMySQL提供了直接的SQL接口但在大型项目中使用ORM对象关系映射框架可以使代码更加清晰from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker # 创建SQLAlchemy引擎底层使用PyMySQL engine create_engine(mysqlpymysql://user:passlocalhost/db) # 创建Session工厂 Session sessionmaker(bindengine) # 使用Session session Session() try: # 执行查询 users session.execute(SELECT * FROM users) for user in users: print(user) finally: session.close()在实际项目中我发现对于简单的查询直接使用PyMySQL更高效而对于复杂的业务逻辑使用ORM可以提高开发效率和代码可维护性。
延伸阅读

更多相关文章

2026/9/4 7:11:40

跨引擎插件系统设计:实现UE、Unity、Godot三大引擎功能复用

1. 项目概述:跨引擎插件设计的核心挑战与价值 在游戏开发领域,Unreal Engine、Unity3D和Godot是三大主流引擎,各自拥有庞大的用户群体和独特的生态。无论是独立开发者还是大型工作室,都常常面临一个现实问题:一个精心打…

2026/9/8 12:34:39

三段式状态机实现与FPGA调试:从基础概念到EtherCAT实战

状态机是嵌入式开发和数字逻辑设计中的核心概念,今天我们来深入探讨A04状态机思想的实现方法。这个项目重点不是理论讲解,而是如何在实际项目中正确应用状态机模式,特别是三段式状态机的规范写法、事件驱动机制以及常见问题的解决方案。 如果…

2026/9/7 13:57:36

AI辅助开发工程体系:规则、流程与基础设施实践

1. AI辅助开发工程体系的定义与价值在2023年GitHub发布的开发者报告中显示,92%的受访者已经在日常开发中使用某种形式的AI工具。AI辅助开发已经从早期的代码补全工具,演进为贯穿软件开发生命周期的系统性工程方法。这种转变不仅仅是工具层面的升级&#…

2026/9/12 8:15:09

CPU、内存、硬盘:电脑硬件三件套的分工与协作原理

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

2026/9/12 8:15:09

SNMP协议栈选型:Net-SNMP与国产自研在信创迁移中的实战对比

SNMP这东西,平时不显山不露水,一旦碰上设备纳管、网络监控、平台对接,它就是绕不过去的那道坎。这个标题里几个关键词——SNMP协议栈、SNMP SDK、Net-SNMP、国产自研、信创,我基本都折腾过,尤其最近两年做信创环境下的…

2026/9/12 8:15:09

基于Matlab的手指手掌静脉识别实现与算法详解

简介:面向机器视觉课程创新实践,这份手指手掌静脉识别Matlab工程聚焦手部静脉图像预处理算法实验研究。项目完整覆盖静脉识别链路,对手指和手掌分别进行轮廓分割、感兴趣区域(ROI)截取、静脉纹理增强与分割&#xff0c…

2026/9/12 8:15:09

制定项目章程全解析:启动过程组考点与10道真题拆解

很多备考信息系统项目管理师的同学,看到“启动过程组”就开始头疼:不就是一个立项流程吗,怎么还整出输入、工具与输出了?结果做题时各种翻车——商业文件被当成项目文件、项目章程以为是项目经理发布的、启动大会当成正式过程………

2026/9/12 8:15:08

分数阶模型与FOTF工具箱:从传递函数到分数阶PID整定实战

简介:专门处理分数阶系统建模与仿真的MATLAB微积分工具箱,面向科研人员、工程师及高校学生,解决分数阶微分方程求解、传递函数构建与数值积分等核心问题。压缩包共289个文件,总大小约2.32MB,含164个m脚本、53个mdl与37…

2026/9/12 8:10:08

GEO产业图谱解析与企业竞争力分析

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

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/12 6:37:43

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码