Python基础:PyMySQL
前言:PyMySQL 是 Python 中用于连接和操作 MySQL 数据库的第三方库,它实现了 Python DB API 2.0 规范,允许开发者通过 Python 代码直接与 MySQL 数据库交互(执行 SQL 语句、获取结果等)。由于 Python 标准库中没有内置 MySQL 驱动,PyMySQL 成为了最常用的 MySQL 连接工具之一。
一、PyMySQL 的核心作用
简单来说,PyMySQL 是 Python 与 MySQL 之间的 “桥梁”:
- 负责在 Python 程序和 MySQL 服务器之间建立网络连接
- 将 Python 代码中的 SQL 语句传递给 MySQL 服务器执行
- 将 MySQL 服务器返回的结果(如查询数据、执行状态)传递回 Python 程序
- 处理连接过程中的认证、编码、错误等问题
二、安装 PyMySQL
使用 pip 即可快速安装:
pip install pymysql
三、PyMySQL 基本使用流程
使用 PyMySQL 操作 MySQL 数据库的核心步骤可总结为:
建立连接 → 获取游标 → 执行 SQL → 处理结果 → 关闭资源1. 建立连接(connect)
首先需要通过
pymysql.connect()
函数与 MySQL 服务器建立连接,参数包括:
host
:MySQL 服务器地址(默认localhost
)user
:数据库用户名password
:用户密码database
:要连接的数据库名port
:MySQL 端口(默认 3306)charset
:字符编码(推荐utf8mb4
,支持表情符号)autocommit
:是否自动提交事务(默认False
,需手动提交)示例:
import pymysql# 建立连接 conn = pymysql.connect(host='localhost',user='root',password='your_password',database='test_db',charset='utf8mb4' )
2. 获取游标(cursor)
连接建立后,需要创建游标对象(
cursor
),用于执行 SQL 语句和获取结果:# 创建游标 cursor = conn.cursor()
游标有两种常用类型:
- 默认游标:返回结果为元组(
(value1, value2, ...)
)- 字典游标:返回结果为字典(
{'column1': value1, 'column2': value2, ...}
),更易读设置字典游标:
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 结果以字典形式返回
3. 执行 SQL 语句
通过游标对象的
execute()
方法执行 SQL 语句,支持增删改查(CRUD):(1)查询数据(SELECT)
# 执行查询 sql = "SELECT id, name, age FROM users WHERE age > %s" cursor.execute(sql, (18,)) # %s 是参数占位符,避免 SQL 注入,参数以元组传入# 获取结果 # 方法1:获取所有结果(适合数据量小的情况) results = cursor.fetchall() # 字典游标返回 [{'id':1, 'name':'Alice'}, ...] for row in results:print(row)# 方法2:逐行获取(适合数据量大的情况) row = cursor.fetchone() # 获取第一行 while row:print(row)row = cursor.fetchone()
(2)插入数据(INSERT)
sql = "INSERT INTO users (name, age) VALUES (%s, %s)" try:# 执行插入cursor.execute(sql, ('Bob', 25))# 提交事务(因为 autocommit 默认是 False)conn.commit()print("插入成功,新记录ID:", cursor.lastrowid) # 获取插入的自增ID except Exception as e:# 出错时回滚事务conn.rollback()print("插入失败:", e)
(3)更新数据(UPDATE)
sql = "UPDATE users SET age = %s WHERE name = %s" try:cursor.execute(sql, (26, 'Bob'))conn.commit()print("影响行数:", cursor.rowcount) # 获取受影响的行数 except Exception as e:conn.rollback()print("更新失败:", e)
(4)删除数据(DELETE)
sql = "DELETE FROM users WHERE id = %s" try:cursor.execute(sql, (1,))conn.commit()print("删除成功,影响行数:", cursor.rowcount) except Exception as e:conn.rollback()print("删除失败:", e)
4. 关闭资源
操作完成后,需关闭游标和连接,释放资源:
# 关闭游标 cursor.close() # 关闭连接 conn.close()
四、关键注意事项
1、防止 SQL 注入
必须使用参数化查询(
%s
占位符),而非字符串拼接。
❌ 错误示例(有注入风险):name = "Bob; DROP TABLE users;" # 恶意输入 sql = f"SELECT * FROM users WHERE name = '{name}'" # 危险!
✅ 正确示例:
sql = "SELECT * FROM users WHERE name = %s" cursor.execute(sql, (name,)) # 参数化查询,自动转义特殊字符
2、事务处理
MySQL 默认开启事务,执行
INSERT/UPDATE/DELETE
后需手动调用conn.commit()
提交;出错时用conn.rollback()
回滚,保证数据一致性。
若需自动提交,可在连接时设置autocommit=True
。3、编码问题
连接时指定
charset='utf8mb4'
(而非utf8
),避免中文或表情符号存储乱码(MySQL 的utf8
实际是 utf8mb3,不支持 4 字节字符)。4、连接池
频繁创建 / 关闭连接会影响性能,生产环境中建议使用连接池(如
DBUtils.PooledDB
)管理连接:from dbutils.pooled_db import PooledDB import pymysql# 创建连接池 pool = PooledDB(creator=pymysql,maxconnections=10, # 最大连接数host='localhost',user='root',password='your_password',database='test_db' )# 从连接池获取连接 conn = pool.connection()
五、PyMySQL 与其他 MySQL 驱动的区别
- MySQLdb:早期常用的驱动,但仅支持 Python 2.x,不支持 Python 3,已逐渐被 PyMySQL 替代。
- mysql-connector-python:MySQL 官方推出的驱动,功能与 PyMySQL 类似,但安装包较大,社区活跃度低于 PyMySQL。
- PyMySQL:纯 Python 实现,跨平台性好,支持 Python 3,安装简单,是目前最主流的选择。
总结:PyMySQL 是 Python 操作 MySQL 的基础工具,核心是通过 “连接 - 游标 - 执行 - 处理” 流程实现数据库交互。掌握其基本用法后,结合事务、参数化查询、连接池等进阶技巧,可安全高效地在 Python 项目中操作 MySQL 数据库,适用于 Web 开发、数据分析、自动化脚本等多种场景。