Python3 MySQL 数据库连接 – PyMySQL 驱动(超详细)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
- 《从零手撸:仿小红书(微服务架构)》 已完结,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
前言
在现代软件开发中,数据库连接是构建应用程序的核心能力之一。无论是构建 Web 应用、数据分析工具还是自动化脚本,与数据库的交互都至关重要。Python 作为一门灵活且功能强大的语言,通过第三方库 PyMySQL,能够高效地实现与 MySQL 数据库的连接和操作。本文将从基础到进阶,逐步讲解如何使用 PyMySQL 实现 Python3 与 MySQL 的数据交互,并通过实际案例帮助读者掌握关键知识点。
一、PyMySQL 的核心概念与安装配置
1.1 什么是 PyMySQL?
PyMySQL 是一个纯 Python 编写的 MySQL 客户端库,它实现了 Python 数据库 API 规范 v2.0,并且兼容 Python3。与官方的 MySQL Connector/Python 相比,PyMySQL 的优势在于其轻量级、跨平台特性,以及对中文编码的支持更为友好。
可以将 PyMySQL 想象为一位“快递员”,它负责在 Python 程序与 MySQL 数据库之间传递数据。例如,当程序需要查询数据时,PyMySQL 会将 SQL 语句发送给数据库,再将结果“打包”返回给程序。
1.2 安装与配置
安装 PyMySQL 非常简单,只需通过 pip 命令即可完成:
pip install PyMySQL
安装完成后,需要确保 MySQL 服务已启动,并且数据库的访问权限已配置。例如,如果数据库运行在本地,且用户名为 root
、密码为 password
,可以使用以下代码测试连接:
import pymysql
try:
# 连接到 MySQL 服务器
conn = pymysql.connect(
host="localhost",
user="root",
password="password",
database="test_db",
charset="utf8mb4"
)
print("连接成功!")
except Exception as e:
print(f"连接失败: {str(e)}")
finally:
conn.close()
注意:
- 如果遇到权限问题,需检查 MySQL 用户的访问权限是否允许从当前 IP 地址连接。
charset="utf8mb4"
是推荐的设置,以支持完整的 Unicode 编码(如表情符号)。
二、基础操作:连接、查询与关闭
2.1 连接数据库的完整流程
PyMySQL 的连接过程分为以下步骤:
- 建立连接:通过
connect()
方法创建与数据库的通信通道。 - 获取游标:游标(Cursor)是执行 SQL 语句、获取结果的核心对象,类似于“导航指针”。
- 执行 SQL 语句:通过游标对象的
execute()
方法执行查询或修改操作。 - 提交或回滚:对数据库进行修改(如插入、更新、删除)时,需调用
commit()
提交事务,或rollback()
回滚操作。 - 关闭连接:释放资源,避免连接泄漏。
以下是一个完整的示例:
import pymysql
config = {
"host": "localhost",
"user": "root",
"password": "password",
"database": "my_db",
"charset": "utf8mb4"
}
try:
# 建立连接
conn = pymysql.connect(**config)
cursor = conn.cursor()
# 执行查询
cursor.execute("SELECT * FROM users WHERE age > 25")
results = cursor.fetchall()
for row in results:
print(f"用户ID: {row[0]}, 姓名: {row[1]}, 年龄: {row[2]}")
except Exception as e:
print(f"操作失败: {str(e)}")
conn.rollback() # 回滚事务
finally:
cursor.close()
conn.close()
2.2 常见 SQL 操作示例
2.2.1 查询数据
查询操作通常使用 SELECT
语句,并通过 fetchone()
、fetchmany()
或 fetchall()
方法获取结果:
cursor.execute("SELECT * FROM users WHERE id = 1")
user = cursor.fetchone()
print(user) # 输出元组格式,如 (1, 'Alice', 30)
cursor.execute("SELECT * FROM users LIMIT 5")
users = cursor.fetchmany(3) # 获取前 3 条记录
2.2.2 插入数据
插入数据时,可以使用参数化查询(避免 SQL 注入):
sql = "INSERT INTO users (name, age) VALUES (%s, %s)"
cursor.execute(sql, ("Bob", 28))
conn.commit()
users = [("Charlie", 22), ("Diana", 35)]
sql = "INSERT INTO users (name, age) VALUES (%s, %s)"
cursor.executemany(sql, users)
conn.commit()
2.2.3 更新与删除
更新和删除操作与插入类似,但需注意事务的提交:
cursor.execute("UPDATE users SET age = 31 WHERE name = 'Alice'")
conn.commit()
cursor.execute("DELETE FROM users WHERE id = 2")
conn.commit()
三、高级技巧与优化
3.1 使用上下文管理器(with 语句)
通过 with
语句可以自动管理连接和游标的关闭,避免手动调用 close()
:
import pymysql
config = {
"host": "localhost",
"user": "root",
"password": "password",
"database": "my_db"
}
with pymysql.connect(**config) as conn:
with conn.cursor() as cursor:
cursor.execute("SELECT * FROM users")
print(cursor.fetchall())
3.2 事务控制
在需要保证数据一致性的场景(如转账操作),可以显式开启事务:
try:
with pymysql.connect(**config) as conn:
conn.begin() # 开始事务
cursor = conn.cursor()
cursor.execute("UPDATE accounts SET balance = balance - 100 WHERE id = 1")
cursor.execute("UPDATE accounts SET balance = balance + 100 WHERE id = 2")
conn.commit() # 提交事务
except Exception as e:
conn.rollback() # 发生错误时回滚
3.3 游标类型与性能优化
PyMySQL 提供了多种游标类型,以适应不同场景:
游标类型 | 描述 |
---|---|
Cursor | 默认游标,返回元组列表,适合小数据量查询。 |
DictCursor | 返回字典格式结果,便于通过列名访问数据。 |
SSCursor | 服务器端游标,适合大数据量查询(逐行获取数据,减少内存占用)。 |
示例代码:
with conn.cursor(pymysql.cursors.DictCursor) as cursor:
cursor.execute("SELECT * FROM users")
for row in cursor:
print(f"用户姓名: {row['name']}, 年龄: {row['age']}")
3.4 预编译语句与性能提升
预编译语句(Prepared Statements)可以避免 SQL 注入,并提高重复执行的效率:
with conn.cursor() as cursor:
sql = "INSERT INTO logs (user_id, action) VALUES (%s, %s)"
cursor.prepare(sql) # 预编译
for _ in range(1000):
cursor.execute(None, (1, "login")) # 执行预编译语句
conn.commit()
四、常见问题与解决方案
4.1 连接超时或拒绝连接
原因:MySQL 服务未启动、防火墙阻止端口(默认 3306)或用户权限配置错误。
解决方法:
- 检查 MySQL 服务状态:
systemctl status mysql
- 临时开放端口:
sudo ufw allow 3306
- 验证用户权限:登录 MySQL 后执行
SELECT User, Host FROM mysql.user;
4.2 SQL 注入风险
防范措施:
- 使用参数化查询,避免字符串拼接 SQL 语句。
- 限制数据库用户的权限(如只允许查询,而非修改)。
4.3 连接泄漏问题
解决方法:
- 始终在
finally
块或with
语句中关闭连接。 - 使用连接池(如
pymysqlpool
库)管理多个连接,避免频繁创建和销毁连接。
结论
通过本文的讲解,读者应已掌握 PyMySQL 的核心用法,包括连接配置、基础 SQL 操作、事务控制以及性能优化技巧。PyMySQL 作为 Python 与 MySQL 的桥梁,不仅简化了数据库交互的复杂性,还提供了灵活的接口以应对不同场景的需求。
对于初学者,建议从简单查询开始实践,并逐步尝试编写完整的 CRUD(增删改查)功能;中级开发者则可以深入探索连接池、分布式事务等高级主题。随着实践的深入,PyMySQL 将成为构建数据驱动应用的得力工具。
如需进一步学习,可参考官方文档或尝试将 PyMySQL 与 Web 框架(如 Django 或 Flask)结合使用,以实现更复杂的应用场景。