python连接mysql数据库最常用的是pymysql库,主要步骤为:1. 安装库(pip install pymysql);2. 导入库并配置连接参数(host、port、user、password、db、charset等);3. 使用pymysql.connect()建立连接;4. 通过connection.cursor()获取游标;5. 执行sql操作(增删改查);6. 修改操作需调用connection.commit()提交事务;7. 操作完成后在finally块中关闭游标和连接。常见问题包括编码不一致导致中文乱码,应统一使用charset='utf8mb4';连接参数错误需仔细核对;未调用commit()导致数据未保存;直接拼接sql存在注入风险,应使用参数化查询;未关闭连接可能导致资源泄露,应使用try...finally或with语句确保释放资源。除pymysql外,还可选择官方驱动mysql-connector-python(性能更优),或使用orm框架如sqlalchemy(功能强大、开发高效但有性能开销)和peewee(轻量简洁),前者适合复杂项目,后者适合快速开发。生产环境中应通过环境变量或配置文件管理数据库凭证,避免硬编码;使用dbutils等第三方库实现连接池(如pooleddb)提升高并发下的性能;结合with语句自动管理连接和游标的获取与释放;正确使用事务保证数据一致性;并记录错误日志以便监控和排查问题。

Python要连接MySQL数据库,PyMySQL无疑是目前最直接、最常用的选择之一。它是一个纯Python实现的MySQL客户端库,用起来非常方便,能让你轻松地执行SQL查询、管理数据,几乎是Python操作MySQL的标配。
连接MySQL数据库,使用PyMySQL主要分几步:先安装库,然后导入,接着建立连接,获取游标,执行SQL命令,最后别忘了提交更改并关闭连接。
要开始,首先得确保你的Python环境里安装了PyMySQL。这很简单,打开终端或者命令行工具,输入:
立即学习“Python免费学习笔记(深入)”;
pip install PyMySQL
安装好之后,就可以开始写代码了。一个基本的连接、查询和插入流程大致是这样:
import pymysql
# 数据库连接参数
db_config = {
'host': '127.0.0.1', # 或者你的MySQL服务器IP地址
'port': 3306,
'user': 'your_username',
'password': 'your_password',
'db': 'your_database_name',
'charset': 'utf8mb4', # 推荐使用utf8mb4,避免字符编码问题
'cursorclass': pymysql.cursors.DictCursor # 这样查询结果会以字典形式返回,方便处理
}
connection = None
cursor = None
try:
# 建立数据库连接
connection = pymysql.connect(**db_config)
print("数据库连接成功!")
# 获取游标对象,用于执行SQL查询
# cursorclass=pymysql.cursors.DictCursor 会让查询结果以字典形式返回
cursor = connection.cursor()
# --- 示例1: 创建表 (如果不存在) ---
create_table_sql = """
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
"""
cursor.execute(create_table_sql)
print("表 'users' 检查或创建完成。")
# --- 示例2: 插入数据 ---
insert_sql = "INSERT INTO users (name, email) VALUES (%s, %s)"
user_data = [
('张三', 'zhangsan@example.com'),
('李四', 'lisi@example.com')
]
cursor.executemany(insert_sql, user_data) # 批量插入
connection.commit() # 提交事务,保存更改
print(f"成功插入 {cursor.rowcount} 条数据。")
# --- 示例3: 查询数据 ---
select_sql = "SELECT id, name, email FROM users WHERE name = %s"
cursor.execute(select_sql, ('张三',))
result = cursor.fetchone() # 获取一条结果
if result:
print("\n查询到张三的信息:")
print(f"ID: {result['id']}, 姓名: {result['name']}, 邮箱: {result['email']}")
# 查询所有数据
cursor.execute("SELECT id, name, email FROM users")
all_users = cursor.fetchall() # 获取所有结果
print("\n所有用户信息:")
for user in all_users:
print(f"ID: {user['id']}, 姓名: {user['name']}, 邮箱: {user['email']}")
# --- 示例4: 更新数据 ---
update_sql = "UPDATE users SET email = %s WHERE name = %s"
cursor.execute(update_sql, ('zhangsan_new@example.com', '张三'))
connection.commit()
print(f"\n成功更新 {cursor.rowcount} 条数据。")
# --- 示例5: 删除数据 ---
delete_sql = "DELETE FROM users WHERE name = %s"
cursor.execute(delete_sql, ('李四',))
connection.commit()
print(f"成功删除 {cursor.rowcount} 条数据。")
except pymysql.Error as e:
print(f"数据库操作失败: {e}")
if connection:
connection.rollback() # 发生错误时回滚事务
except Exception as e:
print(f"发生未知错误: {e}")
finally:
# 无论成功失败,确保关闭游标和连接
if cursor:
cursor.close()
if connection:
connection.close()
print("数据库连接已关闭。")
这段代码涵盖了从连接到执行增删改查的基本操作。
try...except...finally
connection.commit()
在用PyMySQL连接MySQL时,确实会遇到一些小麻烦,有些是配置问题,有些是操作习惯。
最常见的,恐怕就是编码问题了。如果你的数据库、表、字段以及Python连接时使用的编码不一致,比如数据库是
utf8
latin1
charset='utf8mb4'
utf8mb4
utf8
接着是连接参数配置错误。主机地址(
host
port
user
password
db
host
127.0.0.1
localhost
一个经常被新手忽略的问题是没有提交事务。你执行了
INSERT
UPDATE
DELETE
connection.commit()
commit()
还有就是SQL注入的风险。如果你直接用字符串拼接的方式来构建SQL查询,比如
sql = "SELECT * FROM users WHERE name = '" + user_input + "'"
cursor.execute(sql, (value1, value2))
最后,资源泄露也是个问题。如果你的代码没有在操作完成后关闭游标(
cursor.close()
connection.close()
try...finally
with
pymysql.connect
PyMySQL虽然好用,但它不是唯一的选择。Python社区提供了多种方式来连接MySQL,每种都有其特点和适用场景。
一个非常官方的选择是mysql-connector-python
mysql-connector-python
本书是全面讲述PHP与MySQL的经典之作,书中不但全面介绍了两种技术的核心特性,还讲解了如何高效地结合这两种技术构建健壮的数据驱动的应用程序。本书涵盖了两种技术新版本中出现的最新特性,书中大量实际的示例和深入的分析均来自于作者在这方面多年的专业经验,可用于解决开发者在实际中所面临的各种挑战。 本书内容全面深入,适合各层次PHP和MySQL开发人员阅读,既是优秀的学习教程,也可用作参考手册。
253
再往上一个层次,就是ORM(Object-Relational Mapping)框架了,比如SQLAlchemy
Peewee
SQLAlchemy
Peewee
它们的主要区别在于抽象层次和功能丰富度:
mysql-connector-python
选择哪种方式,取决于你的项目需求、团队熟悉度以及对开发效率和性能的权衡。对于大多数中小型项目,PyMySQL或
mysql-connector-python
在实际的生产环境中,数据库连接的管理远不止简单的连接和关闭。安全性和效率是两个核心考量点。
首先,数据库凭证的妥善管理是安全性的基石。绝不能把数据库的用户名和密码硬编码在代码里,尤其是在版本控制系统(如Git)中。这样做极易导致敏感信息泄露。正确的做法是:
config.ini
settings.py
.env
configparser
dotenv
.gitignore
其次,连接池(Connection Pooling)是提升效率的关键。每次建立数据库连接都需要时间和资源开销。在高并发的应用中,频繁地创建和关闭连接会导致性能瓶颈。连接池就是为了解决这个问题而生:它预先创建好一定数量的数据库连接,并将它们保存在一个池子里。当应用程序需要连接时,直接从池中获取一个可用的连接;使用完毕后,连接不会被关闭,而是返回到池中,供下次复用。
PyMySQL本身不提供内置的连接池,但你可以使用第三方库,比如DBUtils
PooledDB
PersistentDB
from DBUtils.PooledDB import PooledDB
import pymysql
# 数据库连接池配置
POOL_CONFIG = {
'creator': pymysql, # 指定连接的创建者
'host': '127.0.0.1',
'port': 3306,
'user': 'your_username',
'password': 'your_password',
'database': 'your_database_name',
'charset': 'utf8mb4',
'maxconnections': 10, # 最大连接数
'mincached': 2, # 启动时创建的最小连接数
'blocking': True, # 当连接池满时,是否阻塞等待
'ping': 0, # 每次获取连接时是否检查连接的有效性,0表示不检查
'cursorclass': pymysql.cursors.DictCursor
}
# 初始化连接池
pool = PooledDB(**POOL_CONFIG)
def get_db_connection():
"""从连接池获取一个连接"""
return pool.connection()
# 示例用法
try:
with get_db_connection() as conn: # with语句会自动关闭连接(返回到池中)
with conn.cursor() as cursor:
cursor.execute("SELECT VERSION()")
version = cursor.fetchone()
print(f"MySQL 版本: {version['VERSION()']}")
cursor.execute("SELECT COUNT(*) FROM users")
count = cursor.fetchone()
print(f"用户总数: {count['COUNT(*)']}")
except Exception as e:
print(f"数据库操作失败: {e}")
使用
with
此外,事务的正确使用也至关重要。对于涉及多个数据库操作的逻辑单元,应该将它们封装在一个事务中。这意味着要么所有操作都成功并提交(
commit()
rollback()
connection.commit()
connection.rollback()
错误日志和监控也是不可或缺的。在生产环境中,任何数据库连接失败、查询超时或SQL错误都应该被记录下来,并通过监控系统进行告警。这有助于你及时发现并解决潜在的数据库问题,保证服务的稳定性。
最后,参数化查询不仅是为了安全,也是一种良好的编码习惯。它能让你的SQL语句更清晰,避免手动拼接字符串的复杂性,并且能让数据库更好地缓存查询计划,提升效率。始终坚持使用参数化查询。
以上就是Python如何连接MySQL数据库?PyMySQL实战教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号