Python连接MySQL需使用PyMySQL等库作为“桥梁”,通过API发送SQL指令。首先安装库并建立连接,注意配置host、user、password等参数,推荐使用环境变量避免硬编码。常见认证问题包括用户名密码错误、权限不足(如'@localhost'与'@%'区别)、MySQL 8.0+的caching_sha2_password插件不兼容,可通过升级库或修改用户认证方式解决。网络防火墙或端口阻塞3306也需排查。批量操作应使用executemany()方法减少通信开销,并结合事务管理提升效率与一致性;超大规模导入可考虑LOAD DATA INFILE。异常处理必须使用try-except-finally结构,捕获pymysql.Error及其子类(如IntegrityError、OperationalError),出错时回滚事务,确保连接最终关闭,并结合logging记录日志以利排查。

Python连接MySQL数据库,通常会依赖一个专门的数据库连接库,比如
PyMySQL
mysql-connector-python
要让Python和MySQL“说上话”,我们得先准备好“翻译官”——也就是对应的连接库。我个人比较偏爱
PyMySQL
首先,安装这个库:
pip install PyMySQL
安装好之后,就可以开始写代码了。一个基本的连接和查询流程大概是这样的:
立即学习“Python免费学习笔记(深入)”;
import pymysql
# 1. 建立连接
# 注意:这里需要替换成你自己的数据库信息
# 我通常会把这些敏感信息放在环境变量或者配置文件里,避免硬编码
try:
connection = pymysql.connect(
host='localhost', # 数据库服务器地址
user='your_username', # 数据库用户名
password='your_password', # 数据库密码
database='your_database', # 要连接的数据库名
charset='utf8mb4', # 字符集,防止中文乱码
cursorclass=pymysql.cursors.DictCursor # 返回字典形式的结果,我个人觉得更方便
)
print("数据库连接成功!")
# 2. 创建游标对象
# 游标就像是你在数据库里操作的“光标”,所有的SQL命令都通过它来执行
with connection.cursor() as cursor:
# 3. 执行SQL查询
sql_query = "SELECT id, name, email FROM users WHERE status = %s"
cursor.execute(sql_query, ('active',)) # 参数化查询是好习惯,防止SQL注入
# 4. 获取查询结果
# fetchall() 获取所有结果
# fetchone() 获取一个结果
# fetchmany(size) 获取指定数量的结果
results = cursor.fetchall()
for row in results:
print(row) # 如果cursorclass是DictCursor,这里会打印字典
# 5. 执行数据插入操作
insert_sql = "INSERT INTO products (name, price) VALUES (%s, %s)"
product_data = ('新产品A', 99.99)
cursor.execute(insert_sql, product_data)
print(f"插入了一条数据,ID: {cursor.lastrowid}") # 获取最后插入的ID
# 6. 执行数据更新操作
update_sql = "UPDATE products SET price = %s WHERE name = %s"
cursor.execute(update_sql, (109.99, '新产品A'))
print(f"更新了 {cursor.rowcount} 条数据。")
# 7. 提交事务
# 对于INSERT, UPDATE, DELETE操作,需要提交才能真正写入数据库
connection.commit()
print("事务已提交。")
except pymysql.Error as e:
print(f"数据库操作失败: {e}")
# 发生错误时,回滚事务,撤销所有未提交的更改
if 'connection' in locals() and connection.open:
connection.rollback()
print("事务已回滚。")
finally:
# 8. 关闭连接
# 无论成功失败,都确保关闭连接,释放资源
if 'connection' in locals() and connection.open:
connection.close()
print("数据库连接已关闭。")这段代码基本涵盖了连接、查询、插入、更新和关闭的完整流程。关键在于
pymysql.connect
cursor.execute
connection.commit()
在Python里连MySQL,最头疼的往往不是代码逻辑,而是连接不上。这其中,认证问题绝对是重灾区。我见过不少人卡在这里,搞得焦头烂额。
一个很常见的场景是用户名或密码错误。这听起来有点傻,但真的很多人会因为输错一个字母、少一个符号,或者复制粘贴的时候多了一个空格而连接失败。所以,第一步永远是仔细核对你的
user
password
接着是用户权限不足。即使用户名密码都对,如果这个用户没有权限从你的程序所在的IP地址连接,或者没有权限访问你指定的数据库,那也会报错。MySQL的用户权限管理很细致,比如
'your_username'@'localhost'
'your_username'@'%'
%
Host
SELECT
INSERT
UPDATE
DELETE
再来就是MySQL 8.0+版本带来的认证插件问题。MySQL 8.0默认的认证插件从
mysql_native_password
caching_sha2_password
Authentication plugin 'caching_sha2_password' cannot be loaded
PyMySQL
mysql-connector-python
mysql_native_password
ALTER USER 'your_username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES;
但这样做会降低一点安全性,所以要权衡。
最后,还有网络防火墙或端口问题。有时候数据库服务器和你的Python程序不在同一台机器上,网络中间可能存在防火墙阻挡了3306端口(MySQL默认端口)的访问。或者,MySQL服务器本身配置了只监听特定IP,没有监听你程序所在的IP。这些都需要服务器管理员去排查。
当你需要一次性插入、更新大量数据时,如果每条数据都单独执行一次
INSERT
UPDATE
最直接也是最推荐的方式是使用连接库提供的
executemany()
比如,我们要插入几百条用户数据:
import pymysql
# 假设已经建立了连接 connection
# ... (连接代码同上) ...
try:
with connection.cursor() as cursor:
users_to_insert = [
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com'),
('Charlie', 'charlie@example.com'),
# ... 更多用户数据 ...
]
# 准备SQL模板
insert_sql = "INSERT INTO users (name, email) VALUES (%s, %s)"
# 使用executemany批量执行
cursor.executemany(insert_sql, users_to_insert)
# 提交事务
connection.commit()
print(f"成功插入了 {cursor.rowcount} 条用户数据。")
except pymysql.Error as e:
print(f"批量插入失败: {e}")
connection.rollback()
print("事务已回滚。")
finally:
if connection.open:
connection.close()executemany()
除了
executemany()
executemany()
最后,如果你面对的是超大规模的数据导入(比如上百万行),
executemany()
LOAD DATA INFILE
cursor.execute()
LOAD DATA INFILE
在任何实际的应用程序中,数据库操作都不能假设永远成功。网络波动、数据库宕机、SQL语法错误、数据完整性约束冲突等等,都可能导致操作失败。所以,健壮的错误和异常处理是必不可少的。
Python中处理异常的核心机制是
try...except...finally
try
except
finally
以
PyMySQL
pymysql.Error
pymysql.IntegrityError
pymysql.OperationalError
import pymysql
from pymysql.err import OperationalError, IntegrityError, ProgrammingError
connection = None # 初始化连接为None,方便finally块判断
try:
connection = pymysql.connect(
host='localhost',
user='your_username',
password='your_password',
database='your_database',
charset='utf8mb4'
)
print("数据库连接成功。")
with connection.cursor() as cursor:
# 尝试执行一个可能导致完整性错误的插入
# 假设 products 表的 name 字段是唯一的
try:
insert_sql = "INSERT INTO products (name, price) VALUES (%s, %s)"
cursor.execute(insert_sql, ('独一无二的产品', 123.45))
cursor.execute(insert_sql, ('独一无二的产品', 543.21)) # 再次插入同名产品,会报错
connection.commit()
print("数据插入成功。")
except IntegrityError as e:
print(f"数据完整性错误:{e}。可能是重复的唯一键。")
connection.rollback() # 发生错误时回滚事务
print("事务已回滚。")
except ProgrammingError as e:
print(f"SQL语法或编程错误:{e}。请检查SQL语句或参数。")
connection.rollback()
print("事务已回滚。")
# 尝试执行一个错误的查询,比如表名写错
try:
cursor.execute("SELECT * FROM non_existent_table")
print("查询成功。")
except OperationalError as e:
print(f"操作错误:{e}。可能是表不存在或连接问题。")
# 这里通常不需要回滚,因为查询操作不会修改数据
except pymysql.Error as e: # 捕获其他所有PyMySQL错误
print(f"发生未知数据库错误: {e}")
connection.rollback()
print("事务已回滚。")
except OperationalError as e:
print(f"数据库连接失败:{e}。请检查主机、端口、用户名、密码或网络。")
except pymysql.Error as e:
print(f"发生更广泛的数据库错误: {e}")
finally:
if connection and connection.open: # 确保连接对象存在且是打开状态
connection.close()
print("数据库连接已关闭。")
在这个例子中,我们捕获了
OperationalError
IntegrityError
ProgrammingError
INSERT
UPDATE
DELETE
connection.rollback()
日志记录也是异常处理中不可或缺的一部分。将捕获到的异常信息、堆栈跟踪以及相关的上下文数据记录到日志文件中,对于后续的故障排查和系统维护至关重要。我通常会结合Python的
logging
以上就是python怎么连接mysql数据库_python数据库操作指南的详细内容,更多请关注php中文网其它相关文章!
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号