Python3 MySQL 数据库连接 – PyMySQL 驱动详解
PyMySQL 是 Python 访问 MySQL 数据库的一个纯 Python 实现的驱动程序,功能强大且支持 Python 3。
本教程将 从安装、基本操作,到事务管理、高级应用,一步步带你掌握 PyMySQL 的使用。
1. 安装 PyMySQL
在使用 PyMySQL 之前,我们需要先安装它:
pip install pymysql
如果你使用 conda:
conda install -c conda-forge pymysql
✅ 解说:
pip install pymysql用于安装PyMySQL驱动。conda install -c conda-forge pymysql适用于 Anaconda 发行版。
2. 连接 MySQL 数据库
2.1 基本连接
import pymysql
# 创建数据库连接
conn = pymysql.connect(
host="localhost", # 服务器地址
user="root", # 用户名
password="123456", # 密码
database="test_db", # 数据库名称
charset="utf8mb4" # 指定编码
)
print("连接成功!")
# 关闭连接
conn.close()
✅ 解说:
pymysql.connect()创建 MySQL 连接对象。host="localhost"连接本机数据库(远程可以填写 IP)。user="root"和password="123456"需要与 MySQL 账号匹配。database="test_db"连接到指定数据库。charset="utf8mb4"保证支持中文存储。
3. 使用游标(Cursor)执行 SQL
在 PyMySQL 中,游标(cursor)用于执行 SQL 语句。
3.1 获取游标
cursor = conn.cursor()
✅ 解说:
cursor()方法创建游标对象,用于执行 SQL 语句。
3.2 创建数据库
cursor.execute("CREATE DATABASE IF NOT EXISTS test_db")
print("数据库创建成功!")
✅ 解说:
CREATE DATABASE创建数据库,IF NOT EXISTS避免重复创建。
3.3 创建表
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
age INT
)
""")
print("表创建成功!")
✅ 解说:
AUTO_INCREMENT设置id为自增主键。PRIMARY KEY设定id为唯一标识。
3.4 插入数据
sql = "INSERT INTO users (name, age) VALUES (%s, %s)"
data = ("张三", 25)
cursor.execute(sql, data)
conn.commit()
print("数据插入成功!")
✅ 解说:
- 使用
(%s, %s)作为 占位符,防止 SQL 注入。 cursor.execute(sql, data)传入参数以安全执行 SQL 语句。conn.commit()提交事务,否则数据不会保存。
3.5 查询数据
sql = "SELECT * FROM users"
cursor.execute(sql)
for row in cursor.fetchall():
print(row)
✅ 解说:
fetchall()获取所有查询结果,返回 列表。
3.6 更新数据
sql = "UPDATE users SET age = %s WHERE name = %s"
cursor.execute(sql, (30, "张三"))
conn.commit()
print("数据更新成功!")
✅ 解说:
UPDATE users SET age = 30 WHERE name = '张三'修改数据。
3.7 删除数据
sql = "DELETE FROM users WHERE name = %s"
cursor.execute(sql, ("张三",))
conn.commit()
print("数据删除成功!")
✅ 解说:
DELETE FROM users WHERE name = '张三'删除匹配数据。
4. 事务管理
MySQL 默认不自动提交事务(autocommit=False),我们需要手动管理事务。
4.1 开启事务
conn.begin()
4.2 提交事务
conn.commit()
4.3 回滚事务
conn.rollback()
4.4 事务示例
try:
conn.begin()
cursor.execute("INSERT INTO users (name, age) VALUES (%s, %s)", ("李四", 28))
cursor.execute("UPDATE users SET age = 35 WHERE name = '王五'")
conn.commit()
print("事务提交成功!")
except:
conn.rollback()
print("事务回滚!")
✅ 解说:
begin()开启事务。commit()确保所有 SQL 成功执行后提交。rollback()遇到错误时撤销所有更改。
5. 存储过程
存储过程可以提高数据库性能,减少 Python 到 MySQL 的交互次数。
5.1 创建存储过程
DELIMITER //
CREATE PROCEDURE GetAllUsers()
BEGIN
SELECT * FROM users;
END //
DELIMITER ;
5.2 Python 调用存储过程
cursor.callproc("GetAllUsers")
for result in cursor.stored_results():
print(result.fetchall())
✅ 解说:
callproc("存储过程名")直接调用数据库端的存储过程,提高查询性能。
6. 性能优化
6.1 使用 DictCursor 返回字典格式
cursor = conn.cursor(pymysql.cursors.DictCursor)
✅ 解说:
- 返回 字典 而非元组,方便 Python 处理数据。
6.2 开启 autocommit
conn.autocommit(True)
✅ 解说:
- 适用于高并发查询,减少
commit()开销。
6.3 使用索引
CREATE INDEX idx_name ON users(name);
✅ 解说:
- 索引加速查询,减少
WHERE语句的扫描时间。
7. 连接池
使用 PyMySQL 连接池减少连接开销:
from pymysqlpool.pool import Pool
pool = Pool(host="localhost", user="root", password="123456", database="test_db", size=5)
conn = pool.get_conn()
print("从连接池获取连接!")
conn.close()
✅ 解说:
size=5允许最多 5 个数据库连接,提高性能。
8. 关闭连接
cursor.close()
conn.close()
✅ 解说:
- 必须关闭连接,避免 MySQL 连接泄漏。
更多详细内容请关注其他相关文章!