Python 使用 PyMySQL 操作 MySQL 数据库增删改查指南
1. 什么是 PyMySQL
PyMySQL 是一个纯 Python 编写的 MySQL 数据库驱动,适用于 Python 3.x 版本。它遵循 Python DB API 2.0 规范,允许 Python 程序与 MySQL 服务器进行交互。相比 Python 2 时代的 MySQLdb,PyMySQL 无需编译依赖,安装和使用更为便捷。
本文详细介绍了 Python 中使用 PyMySQL 库连接和操作 MySQL 数据库的完整流程。内容包括环境安装、连接参数配置、游标类型选择、增删改查(CRUD)的具体代码实现以及事务管理和错误处理机制。文章强调了参数化查询防止 SQL 注入的重要性,并提供了批量操作、上下文管理器使用等最佳实践,旨在帮助开发者构建安全、高效的数据库交互方案。

PyMySQL 是一个纯 Python 编写的 MySQL 数据库驱动,适用于 Python 3.x 版本。它遵循 Python DB API 2.0 规范,允许 Python 程序与 MySQL 服务器进行交互。相比 Python 2 时代的 MySQLdb,PyMySQL 无需编译依赖,安装和使用更为便捷。
在开始之前,请确保已安装 Python 3.x 环境。通过 pip 安装 PyMySQL:
pip install PyMySQL
若需连接 SSL 加密的数据库,可能需要额外安装 cryptography 库。
连接是执行任何数据库操作的前提。pymysql.connect() 方法用于创建连接对象。
host: 数据库主机地址(IP 或域名)user: 登录用户名password: 登录密码db: 目标数据库名称port: 端口号,默认为 3306charset: 字符集,推荐设置为 'utf8mb4' 以支持 Emoji 等特殊字符cursorclass: 游标类,默认返回元组,可改为 DictCursor 返回字典import pymysql
try:
# 创建数据库连接
conn = pymysql.connect(
host='localhost',
user='root',
password='your_password',
db='test_db',
port=3306,
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor # 可选:使用字典游标
)
print("连接成功")
except Exception as e:
print(f"连接失败:{e}")
推荐使用 with 语句自动管理连接和游标的关闭,避免资源泄露。
import pymysql
conn = pymysql.connect(host='localhost', user='root', password='pwd', db='test')
try:
with conn.cursor() as cursor:
# 执行操作
pass
finally:
conn.close()
游标(Cursor)用于遍历结果集和执行 SQL 命令。PyMySQL 提供多种游标类型:
Cursor: 默认游标,返回元组列表。DictCursor: 返回字典列表,键为列名。SSCursor: 单行流式游标,适合大数据量查询,节省内存。fetchone(): 获取下一行记录。fetchmany(size): 获取指定数量的记录。fetchall(): 获取所有剩余记录。rowcount: 只读属性,表示最后一次 execute 影响的行数。import pymysql
db = pymysql.connect(host="localhost", user="root", password="pwd", db="TESTDB")
cursor = db.cursor()
try:
# 如果存在则删除旧表
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
sql = """
CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT
)
"""
cursor.execute(sql)
db.commit()
print("表创建成功")
except Exception as e:
db.rollback()
print(f"创建失败:{e}")
finally:
db.close()
注意:为防止 SQL 注入,务必使用参数化查询(占位符 %s),而不是字符串拼接。
import pymysql
db = pymysql.connect(host="localhost", user="root", password="pwd", db="ck", port=3306)
cursor = db.cursor()
sql = "INSERT INTO store (id, company_id, title, address) VALUES (%s, %s, %s, %s)"
data = ('195', '61', '虹桥路店', '虹桥路 1027 号')
try:
cursor.execute(sql, data)
db.commit()
print(f"插入成功,影响行数:{cursor.rowcount}")
except Exception as e:
db.rollback()
print(f"插入失败:{e}")
finally:
db.close()
批量插入:使用 executemany 提高效率。
sql = "INSERT INTO stu (id, name, age) VALUES (%s, %s, %s)"
data_list = [
('201611001', 'xiaoqian', 20),
('201611002', 'smile', 21),
('201611003', 'wood', 23)
]
cursor.executemany(sql, data_list)
db.commit()
import pymysql
db = pymysql.connect(host="localhost", user="root", password="pwd", db="test")
cursor = db.cursor()
sql = "SELECT * FROM EMPLOYEE WHERE INCOME > %s"
income_threshold = 1000
try:
cursor.execute(sql, (income_threshold,))
results = cursor.fetchall()
for row in results:
print(f"Name: {row[0]}, Income: {row[4]}")
# 如果使用 DictCursor,可直接用 row['FIRST_NAME']
except Exception as e:
print(f"查询失败:{e}")
finally:
db.close()
import pymysql
db = pymysql.connect(host="localhost", user="root", password="pwd", db="test")
cursor = db.cursor()
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = %s"
sex_value = 'M'
try:
cursor.execute(sql, (sex_value,))
db.commit()
print(f"更新成功,影响行数:{cursor.rowcount}")
except Exception as e:
db.rollback()
print(f"更新失败:{e}")
finally:
db.close()
import pymysql
db = pymysql.connect(host="localhost", user="root", password="pwd", db="TESTDB")
cursor = db.cursor()
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s"
age_limit = 20
try:
cursor.execute(sql, (age_limit,))
db.commit()
print(f"删除成功,影响行数:{cursor.rowcount}")
except Exception as e:
db.rollback()
print(f"删除失败:{e}")
finally:
db.close()
MySQL 默认开启自动提交模式。对于涉及多步操作的场景,建议显式控制事务。
commit(): 提交当前事务,使更改永久生效。rollback(): 回滚当前事务,撤销自上次 commit/rollback 以来的所有更改。始终使用 try...except...finally 结构确保连接关闭和数据一致性。
try:
# 业务逻辑
conn.commit()
except:
conn.rollback()
finally:
conn.close()
charset='utf8mb4',避免中文乱码及 Emoji 存储问题。DBUtils)复用连接。db 参数中的数据库是否存在。connect_timeout 参数。通过掌握上述内容,您可以高效地在 Python 应用中集成 MySQL 数据库功能,实现稳定可靠的数据持久化操作。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online