Python接入Mysql数据库
基础教学 1 min read

Python接入Mysql数据库

Blog Author

Python 接入 MySQL 数据库详解

在现代应用开发中,数据持久化 是非常核心的一环。使用 Python 语言访问和操作 MySQL 数据库,不仅能实现数据的存取、更新与查询,还能结合第三方库进行数据可视化与分析。本节将从教学流程、使用场景和最佳实践角度,系统讲解如何使用 Python 接入 MySQL。


一、选择库:PyMySQL vs mysqlclient

✅ 推荐使用:PyMySQL

  • 纯 Python 实现,无需编译器,跨平台兼容性更好。
  • 安装简单,支持 MySQL 5.x 和 8.x。
  • 适用于大多数 Web 和数据处理项目。

mysqlclient

  • 基于 C 的封装,需要依赖编译环境(如 GCC + MySQL dev headers)。
  • 在 Linux 下可能更高效,但部署复杂。

安装命令(支持 MySQL 8 密码验证):

pip install pymysql cryptography

二、基本接入流程(五步法)

✅ 通用操作步骤:

  1. 创建连接对象(Connection)
  2. 获取游标对象(Cursor)
  3. 执行 SQL 语句
  4. 处理事务 / 获取结果
  5. 关闭连接释放资源

📌 小贴士:所有数据库连接操作建议用 try...finallywith 上下文管理,确保稳定关闭连接,防止资源泄露。


三、实用场景演示

### 📌 插入数据场景

适用情境: 添加新用户、新订单、新记录等操作。

cursor.execute(
    'INSERT INTO `tb_dept` VALUES (%s, %s, %s)',
    (no, name, location)
)
  • 事务控制:必须 commit() 才真正写入数据库。
  • 适合表单提交、数据导入等需求。

📌 删除数据场景

适用情境: 用户删除操作、后台数据清理。

cursor.execute('DELETE FROM `tb_dept` WHERE `dno`=%s', (no,))
  • 可以设定 autocommit=True 实现自动提交,适用于小型脚本。
  • 注意权限控制,避免误删核心数据。

📌 更新数据场景

适用情境: 修改用户信息、更新库存、修正数据等。

cursor.execute(
    'UPDATE `tb_dept` SET `dname`=%s, `dloc`=%s WHERE `dno`=%s',
    (name, location, no)
)
  • 可通过比对修改前后的值确保正确修改。
  • 建议加上 WHERE 条件防止全表更新!

📌 查询数据场景(读取)

场景 1:逐行抓取大量数据

适用: 表行数大,不适合一次性加载。

row = cursor.fetchone()
while row:
    print(row)
    row = cursor.fetchone()

场景 2:分页查询(常见于 Web 应用)

适用: 列表页、分页展示、负载均衡。

cursor.execute(
    'SELECT `eno`, `ename`, `job`, `sal` FROM `tb_emp` '
    'ORDER BY `sal` DESC LIMIT %s,%s',
    ((page - 1) * size, size)
)
  • 使用 LIMIT offset, size 实现分页。
  • 可结合前端分页组件、API 接口统一返回结构。

四、事务机制与异常处理

🧩 默认行为

  • PyMySQL 默认开启事务,需手动 commit()

🎯 推荐做法(最佳实践):

try:
    with conn.cursor() as cursor:
        cursor.execute(...)  # SQL 操作
    conn.commit()
except pymysql.MySQLError as err:
    conn.rollback()
    print(err)
finally:
    conn.close()
  • commit 放在业务逻辑之后,确保只在成功时写入。
  • 异常处理统一打印错误,避免静默失败。

五、权限与安全建议

❗ 安全最佳实践

  • 永远不要在生产环境使用 root 账号连接数据库!
  • 使用专用账户并授予必要权限(最小授权原则)。

👇 创建用户和授权的标准命令:

CREATE USER 'guest'@'%' IDENTIFIED BY 'Guest.618';
GRANT INSERT, DELETE, UPDATE, SELECT ON `hrs`.* TO 'guest'@'%';

六、高性能批量插入

✅ 使用 executemany

适用场景: 数据同步、大批量导入。

cursor.executemany(
    'INSERT INTO `tb_emp` VALUES (%s, %s, %s, %s)',
    [
        (1, 'Tom', 'Analyst', 8000),
        (2, 'Jane', 'Manager', 10000),
        ...
    ]
)
  • 比逐条 execute 快数倍。
  • 在数据量非常大时建议分批执行(如每批 500 条)。

七、扩展场景:导出到 Excel

📦 用途:报表生成、备份导出、离线分析

安装依赖:

pip install openpyxl

示例代码:

sheet.append(('工号', '姓名', '职位', '月薪', '补贴', '部门'))
cursor.execute(
    'SELECT `eno`, `ename`, `job`, `sal`, COALESCE(`comm`, 0), `dname` '
    'FROM `tb_emp` NATURAL JOIN `tb_dept`'
)
for row in cursor:
    sheet.append(row)
  • 可用于系统后台报表导出、财务人员汇总分析。
  • 可结合自动化调度系统每日/每周生成报表。

八、最佳实践总结

场景 推荐操作 说明
连接管理 使用 withtry-finally 保证连接及时关闭
安全性 禁用 root、最小权限 防止数据泄露与误操作
查询优化 用分页、迭代器抓取大数据 降低内存占用
插入效率 executemany 做批处理 提高写入速度
事务控制 手动 commit/rollback 灵活应对业务错误
可维护性 封装为函数/模块 便于团队开发和测试

九、进阶建议

  • 使用 ORM 框架(如 SQLAlchemy、Peewee)进一步简化数据操作逻辑。
  • 将数据库连接池集成到 Web 框架中,如 Django、Flask。
  • 利用 Python 多线程或异步库(如 asyncio)优化并发数据访问。

如需进一步学习如「数据导入 Excel」「数据库性能分析」「ORM 框架设计」等模块,欢迎继续深入扩展,我可以继续为你提供详细讲解。