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

发布时间:2026/11/2 5:33:16

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/10/24 19:10:34

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

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

2026/10/25 16:37:37

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

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

2026/10/25 6:05:22

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

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

2026/11/2 5:30:06

Power BI动态环比上月数据:从日期表到DAX度量值的完整实现指南

1. 动态环比这件事,为什么值得单独拎出来讲做报表的人大概都有过这种体验:月初开经营分析会,老板指着大屏问一句“这个月比上个月怎么样”,你低头一看,报表上的环比数字还停留在上个月的口径,要么是写死的静…

2026/11/2 5:30:06

DPU架构解析:从BlueField-2看基础设施卸载与安全加速

简介:面向数据中心架构师、云计算与虚拟化工程师及网络加速方向学习者的技术资料,聚焦NVIDIA BlueField-2 DPU的架构原理与落地场景,帮助读者理解如何以「片上数据中心基础设施」思路卸载CPU负载、重构裸金属与虚拟化环境下的网络、存储与安全…

2026/11/2 5:30:06

开源模拟器座舱DIY:用铝型材打造高性价比直驱驾驶舱

先说个结论:OpenRig 这类开源模拟器座舱方案,是我见过性价比最离谱的一条路。成品赛车舱动辄几千、上万块,而用铝型材做一套能扛直驱力反馈的架子,材料成本可以压到成品价的一半甚至三分之一,代价只是你愿意动手拧几百…

2026/11/2 5:30:06

Power BI动态环比上月实战:DAX日期表与时间智能详解

做数据分析这行久了,你会发现一个特别有意思的现象:老板们最爱问的问题,翻来覆去就那么几个。“这个月比上个月怎么样?”“为什么跌了?”“哪个区域拖了后腿?”——其中出现频率最高的,毫无疑问…

2026/11/2 5:30:06

Spring Boot Maven插件报错解决方案与优化实践

1. 问题现象与背景解析最近在Spring Boot项目中使用Maven构建时,不少开发者遇到了"Plugin org.springframework.boot:spring-boot-maven-plugin not found"的错误提示。这个报错通常发生在以下几种场景:新创建的Spring Boot项目首次执行mvn pa…

2026/11/2 5:25:06

无标题文档工作流:从草稿到定稿的标题提炼与内容管理

1. 当标题栏空着的时候,我们到底在做什么你有没有过这种经历:打开文档、新建笔记、准备写点什么,光标在标题栏闪了半天,最后干脆留空,直接开始敲正文。项目标题写着"【无标题】",看起来像是偷懒&…

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

2026/11/2 1:04:04

工业级SPI隔离设计:硬件抗扰与信号完整性实战指南

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

2026/11/2 1:04:04

PLFM_RADAR:主动探测数据通道,构建低误报的数据感知系统

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

2026/11/2 1:04:04

工业SPI隔离设计:MAX14431与STM32F746硬件抗干扰实战

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

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

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

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

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