Python 魔法学院 - 第30篇:Python 数据库操作-MySQL ⭐⭐⭐
探索 Python 与 MySQL 的完美结合!本文带你从基础连接、SQL 查询到高级事务管理、ORM 使用,全面掌握 Python 操作 MySQL 的技巧。通过实际案例、性能优化建议和常见问题解决方案,你将学会如何高效处理数据库操作,提升开发效率。
目录
引言
欢迎来到 Python 魔法学院!今天我们将深入探讨 Python 中的数据库操作,特别是如何使用 Python 与 MySQL
数据库进行交互。这篇文章将为你提供实用的知识和技巧,帮助你在实际开发中游刃有余。
1. MySQL 简介
MySQL
是一个广泛使用的开源关系型数据库管理系统(RDBMS),它以其高性能、可靠性和易用性而闻名。Python 提供了多种库来与 MySQL
进行交互,其中最常用的是 mysql-connector-python
和 PyMySQL
。
1.1 为什么选择 MySQL?
- 开源免费:
MySQL
是开源的,这意味着你可以免费使用它。 - 高性能:
MySQL
在处理大量数据时表现出色。 - 易用性:
MySQL
提供了丰富的文档和社区支持,使得学习和使用变得容易。 - 跨平台:
MySQL
可以在多种操作系统上运行,包括Windows
、Linux
和macOS
。
2. 安装 MySQL 连接器
在开始之前,我们需要安装 mysql-connector-python
库。你可以使用 pip
来安装它:
pip install mysql-connector-python
3. 连接到 MySQL 数据库
3.1 创建连接
要连接到 MySQL
数据库,我们需要使用 mysql.connector.connect()
函数。以下是一个简单的示例:
import mysql.connector
# 创建连接
conn = mysql.connector.connect(
host="localhost", # 数据库服务器地址
user="root", # 数据库用户名
password="password", # 数据库密码
database="testdb" # 要连接的数据库名称
)
# 创建游标
cursor = conn.cursor()
# 执行查询
cursor.execute("SELECT * FROM users")
# 获取结果
result = cursor.fetchall()
# 打印结果
for row in result:
print(row)
# 关闭连接
cursor.close()
conn.close()
3.2 连接参数
参数名 | 描述 |
---|---|
host |
数据库服务器地址 |
user |
数据库用户名 |
password |
数据库密码 |
database |
要连接的数据库名称 |
3.3 连接池
在高并发场景下,频繁创建和关闭数据库连接会导致性能问题。使用连接池可以有效地管理数据库连接,提高性能。
from mysql.connector import pooling
# 创建连接池
pool = pooling.MySQLConnectionPool(
pool_name="mypool", # 连接池名称
pool_size=5, # 连接池大小
host="localhost", # 数据库服务器地址
user="root", # 数据库用户名
password="password", # 数据库密码
database="testdb" # 要连接的数据库名称
)
# 从连接池获取连接
conn = pool.get_connection()
cursor = conn.cursor()
# 执行查询
cursor.execute("SELECT * FROM users")
result = cursor.fetchall()
for row in result:
print(row)
# 关闭连接
cursor.close()
conn.close()
4. 执行 SQL 查询
4.1 查询数据
我们可以使用 cursor.execute()
方法来执行 SQL 查询。以下是一个查询所有用户的示例:
cursor.execute("SELECT * FROM users")
result = cursor.fetchall()
for row in result:
print(row)
4.2 插入数据
要插入数据,我们可以使用 INSERT INTO
语句。以下是一个插入新用户的示例:
sql = "INSERT INTO users (name, age) VALUES (%s, %s)" # 插入语句
values = ("Alice", 25) # 插入的值
cursor.execute(sql, values)
conn.commit() # 提交事务
4.3 更新数据
要更新数据,我们可以使用 UPDATE
语句。以下是一个更新用户年龄的示例:
sql = "UPDATE users SET age = %s WHERE name = %s" # 更新语句
values = (26, "Alice") # 更新的值
cursor.execute(sql, values)
conn.commit() # 提交事务
4.4 删除数据
要删除数据,我们可以使用 DELETE
语句。以下是一个删除用户的示例:
sql = "DELETE FROM users WHERE name = %s" # 删除语句
values = ("Alice",) # 删除的条件值
cursor.execute(sql, values)
conn.commit() # 提交事务
5. 事务管理
事务是数据库操作中的一个重要概念,它确保一组操作要么全部成功,要么全部失败。MySQL
支持事务管理,我们可以使用 conn.commit()
和 conn.rollback()
来提交或回滚事务。
5.1 提交事务
try:
cursor.execute("INSERT INTO users (name, age) VALUES (%s, %s)", ("Bob", 30))
conn.commit() # 提交事务
except mysql.connector.Error as err:
print("Error:", err)
conn.rollback() # 回滚事务
5.2 回滚事务
try:
cursor.execute("INSERT INTO users (name, age) VALUES (%s, %s)", ("Charlie", 35))
cursor.execute("INSERT INTO users (name, age) VALUES (%s, %s)", ("David", 40))
conn.commit() # 提交事务
except mysql.connector.Error as err:
print("Error:", err)
conn.rollback() # 回滚事务
6. 使用上下文管理器
为了确保连接和游标在使用后能够正确关闭,我们可以使用上下文管理器。以下是一个使用上下文管理器的示例:
import mysql.connector
with mysql.connector.connect(
host="localhost",
user="root",
password="password",
database="testdb"
) as conn:
with conn.cursor() as cursor:
cursor.execute("SELECT * FROM users")
result = cursor.fetchall()
for row in result:
print(row)
7. 使用 ORM(对象关系映射)
虽然直接使用 SQL 查询非常强大,但在复杂的应用程序中,使用 ORM 可以简化数据库操作。SQLAlchemy
是 Python 中最流行的 ORM 之一。
7.1 安装 SQLAlchemy
pip install sqlalchemy
7.2 使用 SQLAlchemy 连接 MySQL
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 创建引擎
engine = create_engine("mysql+mysqlconnector://root:password@localhost/testdb")
# 创建基类
Base = declarative_base()
# 定义模型
class User(Base):
__tablename__ = 'users' # 表名
id = Column(Integer, primary_key=True) # 主键
name = Column(String(50)) # 姓名
age = Column(Integer) # 年龄
# 创建表
Base.metadata.create_all(engine)
# 创建会话
Session = sessionmaker(bind=engine)
session = Session()
# 添加新用户
new_user = User(name="Eve", age=28)
session.add(new_user)
session.commit()
# 查询用户
users = session.query(User).all()
for user in users:
print(user.name, user.age)
# 关闭会话
session.close()
8. 性能优化
8.1 使用索引
索引可以显著提高查询性能。以下是一个创建索引的示例:
CREATE INDEX idx_name ON users (name); # 在 users 表的 name 列上创建索引
8.2 批量插入
批量插入可以减少数据库操作的次数,从而提高性能。以下是一个批量插入的示例:
users = [("Frank", 22), ("Grace", 29), ("Hank", 34)] # 批量数据
cursor.executemany("INSERT INTO users (name, age) VALUES (%s, %s)", users)
conn.commit() # 提交事务
8.3 使用连接池
连接池可以避免频繁创建和关闭连接,从而提高性能。以下是一个使用连接池的示例:
from mysql.connector import pooling
# 创建连接池
pool = pooling.MySQLConnectionPool(
pool_name="mypool", # 连接池名称
pool_size=5, # 连接池大小
host="localhost", # 数据库服务器地址
user="root", # 数据库用户名
password="password", # 数据库密码
database="testdb" # 要连接的数据库名称
)
# 从连接池获取连接
conn = pool.get_connection()
cursor = conn.cursor()
# 执行查询
cursor.execute("SELECT * FROM users")
result = cursor.fetchall()
for row in result:
print(row)
# 关闭连接
cursor.close()
conn.close()
9. 常见问题与解决方案
9.1 连接失败
问题:无法连接到数据库。
解决方案:
- 检查
host
、user
、password
和database
参数是否正确。 - 确保数据库服务器正在运行。
- 检查防火墙设置,确保端口
3306
(MySQL 默认端口)未被阻止。
9.2 编码问题
问题:插入或查询数据时出现乱码。
解决方案:
- 确保数据库和连接的字符集设置为
utf8
或utf8mb4
。 - 在连接时指定字符集:
conn = mysql.connector.connect(
host="localhost",
user="root",
password="password",
database="testdb",
charset="utf8mb4" # 指定字符集
)
9.3 性能问题
问题:查询速度慢。
解决方案:
- 使用索引:在经常查询的列上创建索引。
- 优化查询语句:避免使用
SELECT *
,只选择需要的列。 - 批量操作:使用
executemany
进行批量插入、更新或删除。 - 使用连接池:避免频繁创建和关闭连接。
9.4 SQL 注入风险
问题:未使用参数化查询,导致 SQL 注入风险。
解决方案:
- 始终使用参数化查询,避免直接拼接 SQL 语句。
# 错误示例:直接拼接 SQL 语句
sql = f"SELECT * FROM users WHERE name = '{user_input}'"
cursor.execute(sql)
# 正确示例:使用参数化查询
sql = "SELECT * FROM users WHERE name = %s"
cursor.execute(sql, (user_input,))
9.5 事务未提交
问题:插入、更新或删除操作未生效。
解决方案:
- 确保在执行写操作后调用
conn.commit()
提交事务。
cursor.execute("INSERT INTO users (name, age) VALUES (%s, %s)", ("Bob", 30))
conn.commit() # 提交事务
10. 总结
通过本文,我们深入探讨了如何使用 Python 与 MySQL
数据库进行交互。我们从基本的连接和查询开始,逐步介绍了事务管理、ORM 使用以及性能优化等高级主题。希望这些知识能够帮助你在实际开发中更加得心应手。
希望你喜欢这篇关于 Python 数据库操作-MySQL 的博客!如果你有任何问题或建议,欢迎在评论区留言。让我们一起在 Python 的世界中不断进步!🚀

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)