Python3 MySQL 数据库连接 – PyMySQL 驱动:从零开始的实战指南
在开发 Web 应用、数据处理工具或后端服务时,数据库是不可或缺的一环。而 Python 作为一门简洁高效的编程语言,与 MySQL 的结合尤为紧密。今天,我们就来深入探讨如何使用 PyMySQL 驱动实现 Python3 与 MySQL 数据库的连接与操作。
你可能会问:为什么是 PyMySQL?因为它是 Python 官方推荐的 MySQL 驱动之一,支持 Python 3,并且安装简单、性能稳定。它就像一座“桥梁”,让 Python 程序能够与 MySQL 数据库进行沟通,发送 SQL 命令、获取数据、更新记录。
接下来的内容,我们将一步步带你从环境准备到实际操作,手把手教你掌握 Python3 MySQL 数据库连接 – PyMySQL 驱动的核心技能。
安装与环境准备
在开始写代码前,我们得先搭建好环境。这一步就像盖房子前的打地基,不容马虎。
首先,确保你的系统中已经安装了 Python 3.6 或更高版本。你可以通过终端输入以下命令检查:
python3 --version
如果输出类似 Python 3.9.16,说明环境没问题。
接着,我们需要安装 PyMySQL。它是一个纯 Python 编写的 MySQL 客户端库,无需编译,直接用 pip 安装即可:
pip install PyMySQL
安装完成后,可以用下面的代码验证是否成功:
import pymysql
print("PyMySQL 安装成功!")
如果没有任何报错,说明你已经准备就绪。
💡 提示:如果你使用的是虚拟环境(推荐做法),请确保在激活环境后执行 pip 安装命令。
建立数据库连接:连接字符串详解
连接数据库,就像打电话给对方。你需要知道对方的“电话号码”(IP 地址)、“门牌号”(端口)、“用户名”和“密码”。在数据库的世界里,这些就是连接参数。
我们来写一个基础的连接代码:
import pymysql
host = 'localhost' # 数据库服务器地址,本地用 localhost
port = 3306 # MySQL 默认端口
user = 'root' # 数据库用户名
password = 'your_password' # 数据库密码
database = 'test_db' # 要连接的数据库名
connection = pymysql.connect(
host=host,
port=port,
user=user,
password=password,
database=database,
charset='utf8mb4' # 推荐使用 utf8mb4 支持中文和 emoji
)
print("数据库连接成功!")
connection.close()
代码注释说明:
host:数据库服务器地址。本地测试时用localhost,线上则用真实 IP 或域名。port:MySQL 默认端口是 3306,除非你修改过。user和password:数据库的登录凭证,务必保密。database:要操作的数据库名称,必须提前创建。charset='utf8mb4':这是关键!utf8在 MySQL 中有字符限制,而utf8mb4支持完整的 Unicode 字符,包括 emoji,强烈建议使用。
⚠️ 注意:在生产环境中,不要将密码硬编码在代码中。可以使用环境变量或配置文件。
创建数据库与表:动手实践
在连接成功后,我们来创建一个数据库和一张表,作为后续操作的基础。
假设我们要管理一个“学生信息表”,包含学号、姓名、年龄和成绩。
import pymysql
connection = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='your_password',
charset='utf8mb4'
)
try:
# 使用 cursor 创建游标对象
with connection.cursor() as cursor:
# 创建数据库(如果不存在)
create_db_sql = "CREATE DATABASE IF NOT EXISTS school_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
cursor.execute(create_db_sql)
print("数据库 school_db 创建成功或已存在")
# 切换到目标数据库
connection.select_db('school_db')
# 创建学生表
create_table_sql = """
CREATE TABLE IF NOT EXISTS students (
id INT AUTO_INCREMENT PRIMARY KEY,
student_id VARCHAR(20) NOT NULL UNIQUE,
name VARCHAR(50) NOT NULL,
age INT,
score DECIMAL(5,2)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
"""
cursor.execute(create_table_sql)
print("学生表 students 创建成功或已存在")
# 提交事务
connection.commit()
except Exception as e:
print(f"操作失败:{e}")
connection.rollback() # 出错时回滚
finally:
connection.close()
print("数据库连接已关闭")
关键点解析:
pymysql.connect()建立连接后,必须调用connection.select_db('school_db')切换到具体数据库。cursor()是执行 SQL 的“工具手”,所有 SQL 操作都要通过它完成。try...except...finally是标准的异常处理结构,确保即使出错也能关闭连接。connection.commit()提交事务,否则更改不会生效。AUTO_INCREMENT:自动递增主键,用于生成唯一 ID。UNIQUE:保证学号不重复,避免数据冲突。
数据增删改查(CRUD)操作实战
现在数据库和表都准备好了,接下来我们来实现最常用的四种操作:增、删、改、查。
1. 插入数据(Insert)
import pymysql
connection = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='your_password',
database='school_db',
charset='utf8mb4'
)
try:
with connection.cursor() as cursor:
# 插入一条学生记录
insert_sql = """
INSERT INTO students (student_id, name, age, score)
VALUES (%s, %s, %s, %s)
"""
# 参数使用 %s 占位符,防止 SQL 注入
data = ('S2024001', '张三', 18, 95.5)
cursor.execute(insert_sql, data)
print(f"插入成功,影响行数:{cursor.rowcount}")
# 提交事务
connection.commit()
except Exception as e:
print(f"插入失败:{e}")
connection.rollback()
finally:
connection.close()
🔒 安全提示:永远不要拼接 SQL 字符串!使用
%s占位符,PyMySQL 会自动转义,防止 SQL 注入攻击。
2. 查询数据(Select)
import pymysql
connection = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='your_password',
database='school_db',
charset='utf8mb4'
)
try:
with connection.cursor() as cursor:
# 查询所有学生
select_sql = "SELECT id, student_id, name, age, score FROM students"
cursor.execute(select_sql)
# 获取所有结果
results = cursor.fetchall()
# 打印结果
print("查询结果:")
for row in results:
print(f"ID: {row[0]}, 学号: {row[1]}, 姓名: {row[2]}, 年龄: {row[3]}, 成绩: {row[4]}")
except Exception as e:
print(f"查询失败:{e}")
finally:
connection.close()
📌 小技巧:
cursor.fetchall()返回所有结果,fetchone()只取第一条,fetchmany(n)取前 n 条。
3. 更新数据(Update)
import pymysql
connection = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='your_password',
database='school_db',
charset='utf8mb4'
)
try:
with connection.cursor() as cursor:
# 更新某位学生的成绩
update_sql = "UPDATE students SET score = %s WHERE student_id = %s"
new_score = 98.0
student_id = 'S2024001'
cursor.execute(update_sql, (new_score, student_id))
print(f"更新成功,影响行数:{cursor.rowcount}")
connection.commit()
except Exception as e:
print(f"更新失败:{e}")
connection.rollback()
finally:
connection.close()
4. 删除数据(Delete)
import pymysql
connection = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='your_password',
database='school_db',
charset='utf8mb4'
)
try:
with connection.cursor() as cursor:
# 删除学号为 S2024001 的学生
delete_sql = "DELETE FROM students WHERE student_id = %s"
student_id = 'S2024001'
cursor.execute(delete_sql, (student_id,))
print(f"删除成功,影响行数:{cursor.rowcount}")
connection.commit()
except Exception as e:
print(f"删除失败:{e}")
connection.rollback()
finally:
connection.close()
最佳实践与性能优化建议
在实际项目中,频繁连接数据库会带来性能损耗。以下是几个关键建议:
| 优化建议 | 说明 |
|---|---|
| 使用连接池 | 通过 pymysqlpool 或 SQLAlchemy 管理连接,避免重复创建 |
| 避免全局连接 | 每次操作使用 with connection.cursor() 自动管理 |
| 合理使用事务 | 批量操作时用 commit() 批量提交,减少 IO 开销 |
| 设置超时时间 | 添加 connect_timeout=10 防止连接卡死 |
| 使用上下文管理器 | with 语句自动关闭连接,防止资源泄露 |
总结:Python3 MySQL 数据库连接 – PyMySQL 驱动的完整路径
通过这篇文章,你已经掌握了 Python3 MySQL 数据库连接 – PyMySQL 驱动的核心技能:从环境搭建、连接配置,到数据库与表的创建,再到增删改查的完整操作流程。
关键在于:理解连接的本质是“通信桥梁”,而 PyMySQL 就是这座桥的建造者。只要掌握好参数配置、SQL 执行与异常处理,你就能轻松驾驭数据库操作。
记住,安全第一:永远使用占位符 %s,避免 SQL 注入;连接后及时关闭,防止资源浪费。
无论你是初学者,还是正在开发项目,这篇文章都为你提供了一套可直接复用的模板和最佳实践。动手试试吧,让 Python 和 MySQL 的组合为你打造更强大的应用!
下一次,我们可能会聊聊如何用 PyMySQL 配合 Flask 构建一个简单的 Web 后台管理系统。敬请期待。