Python 操作 MySQL 数据库全解:增删改查、事务、连接池与性能优化

本章学习目标:全面掌握 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 最佳实践分享

  1. 统一封装:项目必须封装 DB 工具类,禁止散写 SQL
  2. 参数化:所有动态值必须用 % s 占位符
  3. 异常捕获:所有 DB 操作必须 try-catch
  4. 资源关闭:连接、游标必须关闭
  5. ** 禁止 SELECT ***:只查询需要的字段
  6. 批量操作:大量数据用 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 学习建议

  1. 先封装工具类,再写业务
  2. 所有 SQL 必须测试执行计划
  3. 高并发必须用连接池
  4. 重要业务必须加事务

9.3 下一章预告

下一章将深入 Python 异步 MySQL 开发、读写分离、分库分表 等高阶实战内容。


十、课后练习

  1. 使用 PyMySQL 封装一个完整的 DB 工具类
  2. 实现用户表的增删改查 + 事务注册功能
  3. 使用连接池改造代码
  4. 对 10 万条数据做批量插入优化并对比耗时

十一、参考资料

  • PyMySQL 官方文档
  • MySQL 官方 SQL 优化手册
  • DBUtils 连接池文档
  • MDN Web 数据库安全最佳实践
  • 《高性能 MySQL》经典书籍
相关推荐
Leinwin3 小时前
实战教程:3步接入Azure OpenAI调用GPT-5,国内IP直连
后端·python·flask
爱码小白3 小时前
MySQL 系统函数专项练习题
数据库·python·mysql
Wenweno0o3 小时前
Ubuntu 系统配置 VS Code C++ 开发环境
数据库·c++·ubuntu
ayt0073 小时前
Netty NioEventLoopGroup源码深度剖析:高性能网络编程的核心引擎
服务器·前端·数据库
傻啦嘿哟3 小时前
Python 实现 Excel 数据可视化:柱状图制作教程
开发语言·python
Chasing__Dreams3 小时前
Mysql--基础知识点--97--UNION ALL VS UNION
数据库·mysql
老苏畅谈运维3 小时前
Oracle 26ai 向量搜索零入门:从模型加载到语义检索初体验
数据库·oracle·oracle 26ai
ZC跨境爬虫3 小时前
海南大学交友平台登录页开发实战day3(解决python传输并读取登录信息的问题)
前端·数据库·python·html
2601_954434553 小时前
2026年电钢琴品牌专业深度测评:排名前五权威榜单发布
大数据·人工智能·python