【第十一章】Python 调用 MySQL 全面指南:从基础到实践​ - 实践

news/2025/9/23 10:42:44/文章来源:https://www.cnblogs.com/ljbguanli/p/19106735

【第十一章】Python 调用 MySQL 全面指南:从基础到实践​ - 实践

Python 调用 MySQL 全面指南:从基础到实践​

在当今数据驱动的时代,Python 凭借其简洁的语法、丰富的生态库,成为数据处理、Web 开发、自动化脚本编写的首选语言之一;而 MySQL 作为开源关系型数据库的代表,以其高效、稳定、易扩展的特性,广泛应用于各类系统的数据存储场景。两者的结合,是实现 “数据读取 - 处理 - 存储” 闭环的核心环节 —— 无论是电商系统的订单数据管理、数据分析平台的批量数据入库,还是自动化脚本的日志存储,都离不开 Python 对 MySQL 的调用。​



前言

对于初学者而言,从环境搭建到异常处理,从单条数据操作到高并发场景下的连接池优化,往往存在诸多疑问。本文旨在通过 “理论 + 实例 + 执行结果” 的形式,覆盖 Python 操作 MySQL 的全流程知识点,既解决 “怎么用” 的问题,也解释 “为什么这么用”,帮助读者不仅能完成基础交互,更能规避常见坑点,写出高效、安全的数据库操作代码。​

在数据处理与开发中,Python 常需与 MySQL 数据库交互以实现数据存储、查询等功能。本文将覆盖环境搭建、连接配置、SQL 执行、结果处理、事务管理及异常处理等核心知识点,通过代码示例与执行结果,助你快速掌握 Python 操作 MySQL 的完整流程。


一、环境准备:安装必备库

Python 操作 MySQL 需依赖第三方库,常用库有mysql-connector-python(Oracle 官方)和pymysql(Python 社区维护),两者用法类似,本文以mysql-connector-python为例。

1.1 安装库​

通过pip命令安装,执行以下命令:

1、pip install mysql-connector-python
2、若使用pymysql,执行:pip install pymysql

1.2 验证安装​

进入 Python 交互环境,执行导入命令,无报错则安装成功:

import mysql.connector
print("安装成功") # 执行结果:安装成功

二、核心操作:Python 与 MySQL 交互全流程​

2.1 连接 MySQL 数据库​

连接数据库需指定主机地址、用户名、密码、数据库名等参数,通过connect()方法创建连接对象,后续操作均基于该对象。​

示例代码:

import mysql.connector
from mysql.connector import Error
try:
# 1. 创建数据库连接
connection = mysql.connector.connect(
host='localhost', # 主机地址(本地为localhost)
database='test_db', # 要连接的数据库名(需提前创建)
user='root', # MySQL用户名
password='Admin@123' # MySQL密码
)
# 2. 验证连接
if connection.is_connected():
db_info = connection.server_info
print(f"连接成功!MySQL服务器版本:{db_info
}") # 执行结果:连接成功!MySQL服务器版本:8.0.32
# 获取当前数据库游标(用于执行SQL)
cursor = connection.cursor()
# 查询当前使用的数据库
cursor.execute("select database();")
current_db = cursor.fetchone()
print(f"当前连接的数据库:{current_db[0]
}") # 执行结果:当前连接的数据库:test_db
except Error as e:
print(f"连接失败!错误信息:{e
}") # 若参数错误,执行结果例:连接失败!错误信息:1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
finally:
# 3. 关闭连接(避免资源泄漏)
if connection.is_connected():
cursor.close()
connection.close()
print("数据库连接已关闭") # 执行结果:数据库连接已关闭

2.2 执行 SQL 操作(增删改查)​

通过游标对象cursor的execute()方法执行 SQL 语句,不同操作的结果处理方式不同:查询(SELECT)需获取结果,增删改(INSERT/DELETE/UPDATE)需提交事务。​

2.2.1 创建数据表(CREATE TABLE)

# 承接上文的connection和cursor对象
create_table_sql = """
CREATE TABLE IF NOT EXISTS student (
id INT AUTO_INCREMENT PRIMARY KEY, # 自增主键
name VARCHAR(50) NOT NULL, # 姓名(非空)
age INT, # 年龄
score FLOAT # 分数
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
"""
cursor.execute(create_table_sql)
print("数据表student创建成功") # 执行结果:数据表student创建成功

2.2.2 插入数据(INSERT)​

插入单条或多条数据,需通过connection.commit()提交事务,否则数据不会写入数据库。​

示例 1:插入单条数据

insert_sql = "INSERT INTO student (name, age, score) VALUES (%s, %s, %s);"
data = ("张三", 18, 95.5) # 与SQL中的%s对应(注意:不是%s字符串拼接,避免SQL注入)
cursor.execute(insert_sql, data)
connection.commit() # 提交事务
print(f"插入成功,新增数据ID:{cursor.lastrowid
}") # 执行结果:插入成功,新增数据ID:1

示例 2:插入多条数据​

insert_many_sql = "INSERT INTO student (name, age, score) VALUES (%s, %s, %s);"
data_list = [
("李四", 19, 88.0),
("王五", 17, 92.5),
("赵六", 18, 79.0)
]
cursor.executemany(insert_many_sql, data_list) # executemany批量执行
connection.commit()
print(f"批量插入成功,共插入{cursor.rowcount
}条数据") # 执行结果:批量插入成功,共插入3条数据

2.2.3 查询数据(SELECT)​

查询结果通过cursor.fetchone()(获取一条)、cursor.fetchall()(获取所有)、cursor.fetchmany(n)(获取 n 条)获取,结果以元组或元组列表形式返回。​

示例:查询所有学生数据

select_sql = "SELECT id, name, age, score FROM student WHERE age < 20;"
cursor.execute(select_sql)
# 获取所有查询结果
results = cursor.fetchall()
print(f"查询到{cursor.rowcount
}条数据:") # 执行结果:查询到4条数据:
# 遍历结果
for row in results:
student_id = row[0]
name = row[1]
age = row[2]
score = row[3]
print(f"ID:{student_id
},姓名:{name
},年龄:{age
},分数:{score
}")
# 执行结果:
# ID:1,姓名:张三,年龄:18,分数:95.5
# ID:2,姓名:李四,年龄:19,分数:88.0
# ID:3,姓名:王五,年龄:17,分数:92.5
# ID:4,姓名:赵六,年龄:18,分数:79.0

2.2.4 更新数据(UPDATE)​

update_sql = "UPDATE student SET score = %s WHERE name = %s;"
update_data = (90.0, "赵六") # 将赵六的分数改为90.0
cursor.execute(update_sql, update_data)
connection.commit()
print(f"更新成功,影响{cursor.rowcount
}条数据") # 执行结果:更新成功,影响1条数据

2.2.5 删除数据(DELETE)​

delete_sql = "DELETE FROM student WHERE age = %s;"
delete_data = (17,) # 注意:单参数需加逗号,避免被识别为普通元组
cursor.execute(delete_sql, delete_data)
connection.commit()
print(f"删除成功,影响{cursor.rowcount
}条数据") # 执行结果:删除成功,影响1条数据

2.3 事务管理​

MySQL 默认开启事务(InnoDB 引擎),需通过commit()提交事务,或通过rollback()回滚事务(出现错误时),确保数据一致性。​

示例:事务回滚

try:
# 执行两个操作,作为一个事务
cursor.execute("INSERT INTO student (name, age, score) VALUES ('孙七', 20, 85.0);")
# 模拟错误(如分数超过100,实际业务中可能是逻辑错误)
cursor.execute("INSERT INTO student (name, age, score) VALUES ('周八', 21, 105.0);")
connection.commit()
print("事务提交成功")
except Error as e:
# 出现错误,回滚事务(两条插入均不生效)
connection.rollback()
print(f"事务回滚!错误信息:{e
}") # 执行结果:事务回滚!错误信息:...(若无约束,仅提示执行成功,可自定义业务逻辑触发回滚)

2.4 异常处理最佳实践​

实际开发中,需捕获常见异常(如连接失败、SQL 语法错误、数据约束错误),并给出清晰提示,避免程序崩溃。​

示例:完整异常处理模板

import mysql.connector
from mysql.connector import Error
def operate_mysql():
connection = None
cursor = None
try:
# 1. 连接数据库
connection = mysql.connector.connect(
host='localhost',
database='test_db',
user='root',
password='123456'
)
if connection.is_connected():
cursor = connection.cursor()
# 2. 执行SQL(示例:查询)
cursor.execute("SELECT name, score FROM student;")
results = cursor.fetchall()
print("学生列表:", results)
except Error as e:
# 分类处理异常
if "Access denied" in str(e):
print("错误:用户名或密码错误")
elif "Unknown database" in str(e):
print("错误:数据库不存在")
elif "You have an error in your SQL syntax" in str(e):
print(f"错误:SQL语法错误:{e
}")
else:
print(f"未知错误:{e
}")
finally:
# 3. 关闭资源(无论是否报错,均需关闭)
if cursor:
cursor.close()
if connection and connection.is_connected():
connection.close()
print("连接已关闭")
# 调用函数
operate_mysql()
# 执行结果(若正常):
# 学生列表: [('张三', 95.5), ('李四', 88.0), ('赵六', 90.0), ('孙七', 85.0)]
# 连接已关闭

三、进阶技巧:配置文件与连接池​

3.1 从配置文件读取连接参数​

将数据库参数(如密码)写入配置文件(如config.ini),避免硬编码,提高安全性。​

步骤 1:创建 config.ini

[mysql]
host = localhost
database = test_db
user = root
password = Admin@123
port = 3306

步骤 2:读取配置并连接​

import configparser # 用于读取ini文件
# 读取配置
config = configparser.ConfigParser()
config.read('config.ini')
mysql_config = config['mysql']
# 连接数据库
connection = mysql.connector.connect(
host=mysql_config['host'],
database=mysql_config['database'],
user=mysql_config['user'],
password=mysql_config['password'],
port=int(mysql_config['port'])
)
print("从配置文件连接成功") # 执行结果:从配置文件连接成功

3.2 使用连接池(提高性能)​

频繁创建 / 关闭连接会消耗资源,通过连接池管理连接,可复用连接,提升高并发场景下的性能。​

示例:创建连接池

from mysql.connector import pooling
# 创建连接池
connection_pool = pooling.MySQLConnectionPool(
pool_name="my_pool", # 连接池名称
pool_size=5, # 最大连接数(根据需求调整)
pool_reset_session=True, # 重置会话(避免前一个连接的影响)
host='localhost',
database='test_db',
user='root',
password='123456'
)
# 从连接池获取连接
connection1 = connection_pool.get_connection()
connection2 = connection_pool.get_connection()
print(f"连接池当前可用连接数:{connection_pool.pool_size - connection_pool.used_connections
}") # 执行结果:连接池当前可用连接数:3
# 关闭连接(实际是归还到连接池,而非销毁)
connection1.close()
print(f"归还连接后,可用连接数:{connection_pool.pool_size - connection_pool.used_connections
}") # 执行结果:归还连接后,可用连接数:4

四、常见问题与解决方案​

问题现象可能原因解决方案
连接失败:Access denied用户名 / 密码错误检查user和password参数,确保与 MySQL 配置一致
连接失败:Unknown database数据库不存在先通过 MySQL 客户端创建数据库(CREATE DATABASE test_db;)
执行 SQL 报错:You have an error in your SQL syntaxSQL 语句语法错误检查 SQL 关键字、括号、分号,确保与 MySQL 语法一致
插入数据后查询不到未执行connection.commit()增删改操作后必须调用commit()提交事务
批量插入效率低未使用executemany()优先使用executemany()批量执行,而非循环execute()

总结​

本文围绕 Python 调用 MySQL 的核心流程展开,从环境搭建的库安装,到基础的连接配置、增删改查操作,再到进阶的事务管理、异常处理、配置文件与连接池优化,覆盖了从 “入门” 到 “实践” 的关键知识点。核心要点可归纳为以下三点:​

掌握这些知识点后,读者可根据实际需求灵活调整代码 —— 例如结合pandas库实现数据批量读写,或在 Web 框架(如 Django、Flask)中集成 MySQL 操作。后续若需深入,还可探索 ORM 框架(如 SQLAlchemy),进一步简化数据库交互逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/912250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源中国社区:AI驱动下的开发者生态革命

开源中国社区:AI驱动下的开发者生态革命 在数字化浪潮席卷全球的当下,开源中国社区正以一场前所未有的生态革命,重新定义开发者社区的边界与可能性。这个拥有超过1000万用户、1350万开发者的技术交流平台,正在从传…

上海网站建设制作微信莱芜房产网官网

源&#xff5c;机器之心编&#xff5c;张倩、杜伟谷歌、Meta 等科技巨头又挖了一个新坑。在文本转图像上卷了大半年之后&#xff0c;Meta、谷歌等科技巨头又将目光投向了一个新的战场&#xff1a;文本转视频。上周&#xff0c;Meta 公布了一个能够生成高质量短视频的工具——Ma…

哈尔滨网站设计哪家公司好上海贸易公司注册条件

[react] react中setState的第二个参数作用是什么呢&#xff1f; 第二个参数是一个callback函数&#xff0c;用于setState设置state的属性值成功之后的回调&#xff0c;此时调用this.state.property可以取到刚刚设置的最新的值 个人简介 我是歌谣&#xff0c;欢迎和大家一起…

住房城乡建设局网站专业制作网站电脑

ESP32-Web-Server编程-建立第一个网页 HTTP 简述 可能你每天都要刷几个短视频&#xff0c;打开几个网页来娱乐一番。当你打开一个网络上的视频或者图片时&#xff0c;其实际发生了下面的流程&#xff1a; 其中客户端就是你的浏览器啦&#xff0c;服务器就是远程一个存放视频或…

冠县网站建设多少钱网站开发手机模拟器

推荐阅读时间&#xff1a;8min~15min主要内容&#xff1a;卷积神经网络《Convolutional Neural Networks》是Andrw Ng深度学习专项课程中的第四门课。这门课主要介绍卷积神经网络&#xff08;CNN&#xff09;的基本概念、模型和具体应用。该门课共有4周课时&#xff0c;所以我将…

做影视网站须要注意什么网站上做旅游卖家要学什么软件

lambda体中有受检异常,为什么不能在lambda表达式外层try catch,只能在lambda里面try catch xxx.getUpdateList().forEach((map) ->{xxxVO vo new xxxVO();BeanUtils.populate(vo,map); // populate方法往外抛了异常list.add(vo);});因为lambda表达式本身没有处理异常的机制…

百度站长 添加网站深圳龙华邮政编码是多少

MrDoc知识文档平台是一款基于Python开发的在线文档系统&#xff0c;适合作为个人和中小型团队的私有云文档、云笔记和知识管理工具&#xff0c;致力于成为优秀的私有化在线文档部署方案。我现在主要把markdown笔记放在上面&#xff0c;因为平时老是需要查询一些知识点&#xff…

网站建设网页与数据库连接中国建设银行官网招聘

1,其实自来水石出来的水是干净的,但是在运输到我们家的过程中      是不排除会造成二次污染的,比如管道材料故障,小区二次加压等环节      都可能带来虫卵,铁锈,泥沙等污染物,      2,不光咱们的自来水会有这种情况,很多欧美国家的饮用水,      也都需要自己 再…

怎么做网站8uftpwordpress 安全选项

一、需要自己安装PHP和MYSQL服务器环境。 二、务必设置伪静态规则&#xff0c;否则将无法访问文章栏目页面。 三、启用伪静态功能&#xff0c;请在站点设置中选择使用thinkphp的伪静态规则。 四、在域名的根目录下找到”data/config.php”文件&#xff0c;填入数据库的账号和…

石家庄自适应网站建设wordpress房地产插件

通讯网关 api网关这些年来&#xff0c;API网关正在经历一些身份危机 。 它们是否是集中的共享资源&#xff0c;从而促进了API对外部实体的公开和治理&#xff1f; 它们是集群入口哨兵&#xff0c;可以严格控制哪些用户流量进入或离开集群吗&#xff1f; 还是他们根据自己拥有…

日志清理脚本模板 - 一叶舟

日志清理脚本模板日志清理脚本模板 cat /data_log_back_bak/move_old_logs.sh #!/bin/bash# 日志源目录和备份目录LOG_DIR="/data/logs/back" TMP_DIR="/tmp" BAK_DIR="/data_log_back_bak&q…

11.备库出现gap处理方法

备库检查是否有日志缺失: select * from v$archive_gap; THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#1 99 109 从上面的信息可以看出,备库中缺失了99到109的日志。…

网站开发江西网站推广软文是什么

前言算法为王。想学好前端&#xff0c;先练好内功&#xff0c;内功不行&#xff0c;就算招式练的再花哨&#xff0c;终究成不了高手&#xff1b;只有内功深厚者&#xff0c;前端之路才会走得更远。强烈推荐 GitHub 上值得前端学习的数据结构与算法项目&#xff0c;包含 gif 图的…

完整教程:2020年_408统考_数据结构41题

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

[原创]《C#高级GDI+实战:从零开发一个流程图》第10章:鼠标拖动完成连线、拖动时实时显示半透明虚线连线效果、自定义连接点样式

一、前言 上节课程我们实现了连接形状不同的连接点,但在实际使用中会发现很繁琐,需要分别指定开始形状和结束形状的连接点,这明显不符合操作经验逻辑。我们本节课程就来实现鼠标拖动完成连线,拖到哪个连接点就对哪…

修改Abp中Auto API Controllers中 默认生成的 Put、Delete请求

在做公家的项目,有个奇葩的规定,Http请求 不能用Put和Delete。 怎么在使用Abp,自动生成的Api,全局修改原有规则,将修改、删除都改成Post呢? 只需要,在Host项目的XXXModule类中,重写的PreConfigureServices方法…

dedecms做网站网站界面设计分析

一、文件的基本权限权限&#xff1a;r, w, x对于文件来讲&#xff0c;r:&#xff1a;可读&#xff0c;可以使用类似cat等命令查看文件内容&#xff1b;w:可写&#xff0c;可以编辑或删除此文件&#xff1b;x:可执行&#xff0c;exacutable&#xff0c;可以命令提示符下当作命令…

博物馆网站微信公众号建设方案网站未备案 打不开

先安装MMEdu库&#xff01; MMEdu安装&#xff1a;https://blog.csdn.net/zyl_coder/article/details/132483865 下面的代码请在Jupyter上运行&#xff0c;并自己准备数据集。若模型还未训练&#xff0c;请先在本地训练完模型后再进行模型推理。 import cv2 capture cv2.Vi…

公司和公司网站的关系男孩子和男孩子在一起怎么做网站

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 单片机家电产品–OC门电路 前言 记录学习单片机家电产品内容 已转载记录为主 一、知识点 1OC门电路和OD门电路的区别 OC门电路和OD门电路的区别 OC门&#xff1a;三极管…

红叶网站建设方案广州建立网站的公司网站

智能优化算法应用&#xff1a;基于非洲秃鹫算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于非洲秃鹫算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.非洲秃鹫算法4.实验参数设定5.算法结果6.…