PyMySQL 快速入门:从安装到实战
在 Python 中与 MySQL 数据库进行交互是后端开发中的常见需求。PyMySQL 是一个纯 Python 实现的 MySQL 客户端库,它遵循 DB-API v2 规范,并且因为它不依赖于任何 C 库,所以安装和部署都非常方便。
本文将带你从零开始,快速掌握 PyMySQL 的使用方法。
1. 环境准备
在开始之前,请确保你已经准备好以下环境:
- Python 3.x:确保你的系统中已经安装了 Python。
- MySQL 或 MariaDB 数据库:你需要有一个正在运行的数据库实例,并拥有一个可以访问它的账户。
2. 安装 PyMySQL
使用 pip 是安装 PyMySQL 最简单的方式。打开你的终端或命令行工具,输入以下命令:
bash
pip install PyMySQL
等待安装完成即可。
3. PyMySQL 核心概念
PyMySQL 的使用流程非常直观,主要围绕以下两个核心对象:
- Connection (连接对象):代表了与数据库的一次会话。所有的数据库操作都始于建立一个连接。
- Cursor (游标对象):用于执行 SQL 语句并获取结果。一个连接可以创建多个游标。
基本操作流程如下:
1. 导入 pymysql 模块。
2. 调用 pymysql.connect() 建立与数据库的连接。
3. 通过连接对象创建游标 connection.cursor()。
4. 使用游标的 execute() 方法执行 SQL 语句。
5. 如果是查询操作,使用 fetchone(), fetchall() 或 fetchmany() 获取结果。
6. 如果是增、删、改操作,调用 connection.commit() 提交事务。
7. 操作完成后,关闭游标和连接。
4. 快速上手:基本操作
4.1. 建立连接
首先,我们需要连接到数据库。你需要提供主机(host)、用户名(user)、密码(password)和数据库名(database)。
“`python
import pymysql
建立数据库连接
请根据你的实际情况修改以下参数
connection = pymysql.connect(
host=’localhost’, # 数据库主机地址,本地一般为 ‘localhost’ 或 ‘127.0.0.1’
user=’your_username’, # 数据库用户名
password=’your_password’,# 数据库密码
database=’your_database’,# 要操作的数据库名
charset=’utf8mb4′ # 建议使用 utf8mb4 以支持 emoji 等特殊字符
)
print(“数据库连接成功!”)
操作完成后记得关闭连接
connection.close()
“`
4.2. 执行查询 (SELECT)
游标是执行 SQL 的关键。为了更方便地处理结果,我们可以在创建连接时指定 cursorclass=pymysql.cursors.DictCursor,这样查询结果将以字典形式返回,更易读。
使用 with 语句是最佳实践,因为它可以自动管理资源的关闭(无论是游标还是连接)。
“`python
import pymysql
import pymysql.cursors
建立连接,并指定游标类型为 DictCursor
connection = pymysql.connect(
host=’localhost’,
user=’your_username’,
password=’your_password’,
database=’your_database’,
charset=’utf8mb4′,
cursorclass=pymysql.cursors.DictCursor # 关键:返回字典形式的结果
)
try:
# 使用 with 语句可以自动关闭游标
with connection.cursor() as cursor:
# 准备 SQL 语句
sql = “SELECT id, name, email FROM users WHERE id = %s”
# 执行 SQL 语句,并将参数安全地传递给 execute 方法
# 注意:为了防止 SQL 注入,请务必使用这种参数化查询的方式
cursor.execute(sql, (1,))
# 获取单条查询结果
result = cursor.fetchone()
if result:
print("查询结果:")
print(result) # 输出: {'id': 1, 'name': 'Alice', 'email': '[email protected]'}
else:
print("未找到用户。")
finally:
# 确保连接最终被关闭
connection.close()
“`
安全提示:永远不要手动拼接字符串来构建 SQL 查询,例如 f"SELECT ... WHERE id = {user_id}"。这极易受到 SQL 注入攻击。始终使用 cursor.execute(sql, params) 的参数化形式。
4.3. 插入数据 (INSERT)
插入、更新和删除操作都需要在执行后提交事务,否则更改不会被保存到数据库中。
“`python
… (连接代码同上) …
try:
with connection.cursor() as cursor:
sql = “INSERT INTO users (name, email) VALUES (%s, %s)”
# 执行插入操作
cursor.execute(sql, (‘Bob’, ‘[email protected]’))
# 提交事务以保存更改
connection.commit()
print("数据插入成功!")
finally:
connection.close()
“`
4.4. 更新和删除 (UPDATE & DELETE)
更新和删除操作与插入类似,执行后也需要提交事务。
“`python
… (连接代码同上) …
try:
with connection.cursor() as cursor:
# 更新数据
sql_update = “UPDATE users SET email = %s WHERE name = %s”
cursor.execute(sql_update, (‘[email protected]’, ‘Charlie’))
# 删除数据
sql_delete = "DELETE FROM `users` WHERE `name` = %s"
cursor.execute(sql_delete, ('David',))
# 提交事务
connection.commit()
print("数据更新和删除操作已提交。")
except pymysql.MySQLError as e:
print(f”数据库操作失败: {e}”)
# 如果发生错误,回滚事务
connection.rollback()
finally:
connection.close()
“`
5. 实战项目:一个完整的示例
下面是一个完整的脚本,演示了如何创建一个表,并对其进行增删改查(CRUD)操作。
“`python
import pymysql
import pymysql.cursors
— 数据库配置 —
DB_CONFIG = {
‘host’: ‘localhost’,
‘user’: ‘your_username’,
‘password’: ‘your_password’,
‘database’: ‘your_database’,
‘charset’: ‘utf8mb4’,
‘cursorclass’: pymysql.cursors.DictCursor
}
def main():
“””主函数,演示完整的 CRUD 流程”””
connection = pymysql.connect(**DB_CONFIG)
print(“数据库连接成功…”)
try:
with connection.cursor() as cursor:
# 1. 创建一个测试表 (如果不存在)
print("\n1. 准备创建 'employees' 表...")
cursor.execute("DROP TABLE IF EXISTS `employees`")
create_table_sql = """
CREATE TABLE `employees` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(100) NOT NULL,
`email` VARCHAR(100) UNIQUE,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
"""
cursor.execute(create_table_sql)
print("'employees' 表创建成功!")
# 2. 插入多条数据
print("\n2. 插入员工数据...")
employees_to_add = [
('Alice', '[email protected]'),
('Bob', '[email protected]'),
('Charlie', '[email protected]')
]
insert_sql = "INSERT INTO `employees` (`name`, `email`) VALUES (%s, %s)"
# executemany 可以高效地插入多行数据
cursor.executemany(insert_sql, employees_to_add)
connection.commit() # 提交插入操作
print(f"成功插入 {cursor.rowcount} 条数据。")
# 3. 查询所有数据
print("\n3. 查询所有员工信息...")
cursor.execute("SELECT * FROM `employees`")
all_employees = cursor.fetchall()
for emp in all_employees:
print(emp)
# 4. 更新一条数据
print("\n4. 更新 Bob 的邮箱...")
update_sql = "UPDATE `employees` SET `email` = %s WHERE `name` = %s"
cursor.execute(update_sql, ('[email protected]', 'Bob'))
connection.commit() # 提交更新操作
print("数据更新成功!")
# 5. 查询确认更新
print("\n5. 再次查询 Bob 的信息以确认更新...")
cursor.execute("SELECT * FROM `employees` WHERE `name` = %s", ('Bob',))
bob_info = cursor.fetchone()
print(bob_info)
# 6. 删除一条数据
print("\n6. 删除 Charlie 的记录...")
delete_sql = "DELETE FROM `employees` WHERE `name` = %s"
cursor.execute(delete_sql, ('Charlie',))
connection.commit() # 提交删除操作
print("数据删除成功!")
# 7. 最终查询
print("\n7. 查询剩余员工信息...")
cursor.execute("SELECT `name`, `email` FROM `employees`")
remaining_employees = cursor.fetchall()
for emp in remaining_employees:
print(emp)
except pymysql.MySQLError as e:
print(f"发生数据库错误: {e}")
connection.rollback() # 出错时回滚
finally:
connection.close()
print("\n数据库连接已关闭。")
if name == ‘main‘:
main()
“`
总结
PyMySQL 是一个功能强大且易于使用的 Python 库。通过本文,你应该已经掌握了它的核心用法:
- 使用
pip安装。 - 通过
pymysql.connect()建立连接,最好指定DictCursor。 - 使用
with connection.cursor()结构来安全地执行 SQL。 - 使用参数化查询
execute(sql, params)来防止 SQL 注入。 - 对于增、删、改操作,记得调用
connection.commit()提交事务。 - 在
try...except...finally结构中处理异常并确保连接关闭。
有了这些基础,你就可以在你的 Python 项目中自如地与 MySQL 数据库进行交互了。