当前位置: 首页 > news >正文

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 开发、数据分析、自动化脚本等多种场景。

http://www.dtcms.com/a/353480.html

相关文章:

  • 音视频开发学习路线梳理(附 GitHub 仓库)
  • 达梦数据库-控制文件 (二)
  • FPGA开发流程
  • 一键搭建开发环境:制作bash shell脚本
  • Apple Silicon Mac 上解决 Docker 平台不匹配和 QEMU 段错误问题
  • 腾讯云服务器重启卡住:原因分析与底层原理详解
  • AI-调查研究-62-机器人 机械臂五大应用场景详解:从焊接到手术,从农田到太空
  • Knife4j 文档展示异常的小坑
  • GBDT(Gradient Boosting Decision Tree,梯度提升决策树)总结梳理
  • 如何设置 Lustre 文件系统并在其上运行 PostgreSQL
  • 设计模式9-责任链模式
  • UDC否定响应码学习
  • 未成功:使用 Nginx 搭建代理服务器(正向代理 HTTPS 网站)
  • 《StarRocks、Doris、ClickHouse 深度对比:三大 OLAP 引擎的优劣与应用场景》
  • go的实现arp客户端
  • 《方法论》--笛卡尔
  • 【学习笔记】非异步安全函数(禁止在信号处理中调用)
  • 雷卯针对香橙派Orange Pi 4开发板防雷防静电方案
  • 【Golang】 项目启动方法
  • Android12 user版本默认开启adb调试
  • centos7安装java mysql redis nginx
  • docker 所有常用命令,配上思维导图,加图表显示
  • 713 乘积小于k的子数组
  • Mysql数据挂载
  • Leetcode+Java+动态规划IV
  • electron离线开发环境变量ELECTRON_OVERRIDE_DIST_PATH
  • [MT6835] MT6835开启secureboot导致写入分区提示Security deny for [customer].
  • 【图像算法 - 25】基于深度学习 YOLOv11 与 OpenCV 实现人员跌倒识别系统(人体姿态估计版本)
  • 达梦数据库配置文件-COMPATIBLE_MODE
  • LangChain4j入门一:LangChain4j简介及核心概念