本章学习目标:全面掌握 Python 与 MySQL 数据库交互的完整技术栈,熟练使用 PyMySQL、mysql-connector 实现标准 CRUD 操作,精通事务控制、连接池管理与高并发下的 SQL 性能优化,可直接应用于后端开发、数据爬虫、数据分析与自动化运维场景。
一、引言:为什么 Python + MySQL 如此重要
1.1 背景与意义
在后端服务、数据平台、爬虫系统、自动化脚本中,Python + MySQL 是全球最主流的数据持久化方案。MySQL 稳定、轻量、开源,占据关系型数据库市场首位;Python 语法简洁、库生态丰富,快速对接 Web 框架、AI 模型与大数据工具。
据行业统计,超过 65% 的 Python 后端项目 选用 MySQL 作为主存储,而 80% 以上的开发者 会在项目中频繁用到数据库增删改查、事务与连接池。掌握 Python 操作 MySQL,是后端工程师、数据工程师、测试开发、全栈开发者的必备核心技能。
1.2 本章结构概览
plaintext
概念解析 → 环境搭建 → 基础CRUD → 事务控制 → 连接池 → 性能优化 → 实战案例 → 常见问题 → 总结展望
二、核心概念解析
2.1 基本定义
概念一:Python 操作 MySQL 主流驱动
- PyMySQL:纯 Python 实现,轻量易用,兼容 MySQL 5.x/8.0
- mysql-connector-python:Oracle 官方驱动,稳定可靠
- SQLAlchemy:ORM 框架,屏蔽底层差异,适合大型项目
概念二:数据库核心操作
- C:Create(插入)
- R:Read(查询)
- U:Update(更新)
- D:Delete(删除)
概念三:高级特性
- 事务:保证一组操作要么全部成功,要么全部失败
- 连接池:复用数据库连接,避免频繁创建销毁
- 参数化查询:防止 SQL 注入,提升安全性
2.2 关键术语解释
- 连接 Connection:Python 与 MySQL 建立的通信通道
- 游标 Cursor:执行 SQL、获取结果集的对象
- 提交 Commit:将内存数据持久化到磁盘
- 回滚 Rollback:出错时撤销未提交的操作
- 池化 Pool:连接缓存机制,提升并发性能
2.3 技术架构概览
plaintext
┌─────────────────────────────────────────┐
│ 应用层 (Python)
│ 脚本 / Flask / Django / FastAPI
├─────────────────────────────────────────┤
│ 驱动层 (Driver)
│ PyMySQL / mysql-connector / SQLAlchemy
├─────────────────────────────────────────┤
│ 协议层 (MySQL Protocol)
│ TCP/IP 连接、认证、数据传输
├─────────────────────────────────────────┤
│ 存储层 (MySQL Server)
│ 库、表、行、索引、事务日志
└─────────────────────────────────────────┘
三、技术原理深入
3.1 核心技术原理
技术一:PyMySQL 基础连接
python
运行
python
import pymysql
# 创建连接
conn = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='123456',
database='test_db',
charset='utf8mb4'
)
# 获取游标
cursor = conn.cursor()
# 执行 SQL
cursor.execute('SELECT VERSION()')
result = cursor.fetchone()
print('MySQL版本:', result)
# 关闭资源
cursor.close()
conn.close()
技术二:参数化查询(防注入)
python
运行
python
# 安全写法(推荐)
sql = "INSERT INTO user(name, age) VALUES(%s, %s)"
cursor.execute(sql, ('张三', 20))
conn.commit()
技术三:事务执行原理
python
运行
python
try:
# 开启事务(默认自动开启)
cursor.execute(sql1)
cursor.execute(sql2)
conn.commit() # 提交
except Exception as e:
conn.rollback() # 回滚
print('错误:', e)
3.2 数据交互机制
流程:建立连接 → 获取游标 → 执行 SQL → 获取结果 → 提交 / 回滚 → 释放资源
python
运行
python
class MySQLClient:
def __init__(self, host, user, pwd, db):
self.conn = pymysql.connect(host=host, user=user, password=pwd, database=db)
self.cursor = self.conn.cursor()
def query(self, sql, args=None):
self.cursor.execute(sql, args)
return self.cursor.fetchall()
def close(self):
self.cursor.close()
self.conn.close()
3.3 性能基础策略
- 避免频繁创建 / 关闭连接
- 使用批量插入代替循环单条插入
- 使用连接池复用连接
- 查询只查需要字段,禁止 SELECT *
- 为高频查询字段建立索引
四、实践应用指南
4.1 应用场景分析
场景一:后端接口数据存储
- 用户注册 / 登录 / 信息修改
- 订单、商品、日志写入
场景二:爬虫数据落地
- 爬取文章、商品、评论入库
场景三:数据分析与报表
- 批量查询、统计、聚合计算
场景四:定时任务与自动化
- 定期同步数据、清理数据、生成统计结果
4.2 实施步骤详解
步骤一:环境安装
bash
运行
bash
pip install pymysql
pip install mysql-connector-python
pip install dbutils # 连接池
步骤二:创建数据库与表
sql
sql
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE user(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT,
create_time DATETIME DEFAULT NOW()
);
步骤三:封装数据库工具类
步骤四:实现增删改查
步骤五:加入事务与异常处理
步骤六:接入连接池
步骤七:性能压测与优化
4.3 最佳实践分享
- 统一封装:项目必须封装 DB 工具类,禁止散写 SQL
- 参数化:所有动态值必须用 % s 占位符
- 异常捕获:所有 DB 操作必须 try-catch
- 资源关闭:连接、游标必须关闭
- ** 禁止 SELECT ***:只查询需要的字段
- 批量操作:大量数据用 executemany
五、实战案例拆解
5.1 基础增删改查(案例一)
python
运行
python
# 1. 插入
def insert_user(name, age):
sql = "INSERT INTO user(name, age) VALUES(%s, %s)"
cursor.execute(sql, (name, age))
conn.commit()
# 2. 查询
def get_user(id):
sql = "SELECT id,name,age FROM user WHERE id=%s"
cursor.execute(sql, (id,))
return cursor.fetchone()
# 3. 更新
def update_age(id, age):
sql = "UPDATE user SET age=%s WHERE id=%s"
cursor.execute(sql, (age, id))
conn.commit()
# 4. 删除
def delete_user(id):
sql = "DELETE FROM user WHERE id=%s"
cursor.execute(sql, (id,))
conn.commit()
5.2 事务实战(案例二:转账)
python
运行
python
def transfer(from_uid, to_uid, money):
try:
# 扣款
sql1 = "UPDATE account SET balance=balance-%s WHERE uid=%s"
cursor.execute(sql1, (money, from_uid))
# 加款
sql2 = "UPDATE account SET balance=balance+%s WHERE uid=%s"
cursor.execute(sql2, (money, to_uid))
conn.commit()
print("转账成功")
except:
conn.rollback()
print("转账失败,已回滚")
5.3 连接池实战(案例三:高并发)
python
运行
python
from dbutils.pooled_db import PooledDB
import pymysql
pool = PooledDB(
creator=pymysql,
maxconnections=10,
host='localhost',
user='root',
password='123456',
database='test_db'
)
# 从池获取连接
conn = pool.connection()
5.4 批量插入优化(案例四:高效入库)
python
运行
python
# 批量写入(速度提升 10~50 倍)
data = [("张三",20), ("李四",21), ("王五",22)]
sql = "INSERT INTO user(name,age) VALUES(%s,%s)"
cursor.executemany(sql, data)
conn.commit()
六、性能优化策略
6.1 连接优化
- 使用连接池,避免频繁 connect/close
- 合理设置最大连接数(一般 8~20)
6.2 SQL 优化
- 禁止 SELECT *
- 为 WHERE、ORDER BY、JOIN 字段建索引
- 避免在 WHERE 条件中使用函数
- 分页用 LIMIT,避免全表扫描
6.3 写入优化
- 批量插入 executemany
- 关闭自动提交,手动 commit
- 大事务拆分为小事务
6.4 查询优化
- 用 LIMIT 限制返回条数
- 用 COUNT (1) 代替 COUNT (*)
- 频繁查询结果做内存缓存
七、常见问题解答
Q1:MySQL 8.0 报错 caching_sha2_password
解决:驱动添加 auth_plugin='mysql_native_password'
Q2:SQL 注入如何防范
解决:永远使用参数化查询,不拼接字符串
Q3:Too many connections
解决:使用连接池,控制最大并发数
Q4:中文乱码
解决:charset=utf8mb4,数据库表也用 utf8mb4
Q5:事务不生效
解决:确保表引擎是 InnoDB,MyISAM 不支持事务
八、未来发展趋势
8.1 技术趋势
- 异步 MySQL 驱动(asyncmy、aiomysql)普及
- ORM + 异步成为 Web 高并发标配
- 云数据库 + Python 自动化运维成为主流
8.2 应用趋势
- Python + MySQL 继续主导中小项目与互联网后端
- 数据中台、实时数仓广泛使用 Python 对接 MySQL
8.3 职业发展
- 初级:掌握 CRUD、事务
- 中级:掌握连接池、批量操作、SQL 优化
- 高级:掌握分库分表、读写分离、异步驱动、高可用架构
九、本章小结
9.1 核心要点回顾
- Python 操作 MySQL 以 PyMySQL 最常用
- 必掌握:增删改查、参数化、事务、连接池
- 高性能关键:批量、池化、索引、避免长连接
- 安全关键:参数化防注入
9.2 学习建议
- 先封装工具类,再写业务
- 所有 SQL 必须测试执行计划
- 高并发必须用连接池
- 重要业务必须加事务
9.3 下一章预告
下一章将深入 Python 异步 MySQL 开发、读写分离、分库分表 等高阶实战内容。
十、课后练习
- 使用 PyMySQL 封装一个完整的 DB 工具类
- 实现用户表的增删改查 + 事务注册功能
- 使用连接池改造代码
- 对 10 万条数据做批量插入优化并对比耗时
十一、参考资料
- PyMySQL 官方文档
- MySQL 官方 SQL 优化手册
- DBUtils 连接池文档
- MDN Web 数据库安全最佳实践
- 《高性能 MySQL》经典书籍