1. Python数据库操作实验概述
作为一名长期从事Python开发的工程师,我经常需要处理各种数据存储和查询任务。这次实验将带大家完整走一遍Python与MySQL数据库交互的全流程,从环境搭建到实际应用,涵盖pymysql和pandas两大核心工具的使用。
这个实验特别适合以下人群:
- 刚接触数据库操作的Python初学者
- 需要将Excel数据迁移到数据库的数据分析人员
- 想系统学习Python数据库编程的开发者
实验环境要求:
- Windows 10/11操作系统
- 已安装Anaconda(含Jupyter Notebook)
- MySQL 8.0数据库
- Python 3.7+
提示:实验过程中请保持MySQL服务运行,不要关闭命令行窗口
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. MySQL环境配置详解
2.1 MySQL安装与初始化
很多同学在第一步安装MySQL时就容易遇到问题,这里分享我总结的可靠安装方法:
- 解压安装包:
bash复制# 将mysql-8.0.30-winx64.zip解压到C:\ProgramData
# 确保路径为C:\ProgramData\mysql-8.0.30-winx64
- 初始化数据库:
bash复制cd C:\ProgramData\mysql-8.0.30-winx64\bin
.\mysqld --initialize --console # 注意记录输出的临时密码
.\mysqld -install
net start mysql
- 修改root密码:
bash复制.\mysql -u root -p # 使用刚才的临时密码登录
alter user 'root'@'localhost' identified by '123456';
commit;
2.2 常见安装问题解决
在实际教学中,我发现同学们常遇到这些问题:
- 服务启动失败:
- 检查3306端口是否被占用
- 查看MySQL错误日志(data目录下.err文件)
- 尝试重新初始化:
.\mysqld --remove然后重新安装
- 忘记临时密码:
- 删除data目录重新初始化
- 或者查看错误日志中的临时密码
- 路径问题:
- 确保所有操作都在bin目录下执行
- 路径不要包含中文或空格
3. 数据库连接与操作
3.1 使用pymysql建立连接
pymysql是Python连接MySQL最常用的库,下面是标准连接方式:
python复制import pymysql
# 建立数据库连接
db = pymysql.connect(
host='localhost',
user='root',
password='123456',
database='student_101' # 可以省略,后续用USE语句选择
)
# 创建游标对象
cursor = db.cursor()
# 执行SQL语句
cursor.execute("CREATE DATABASE IF NOT EXISTS student_101")
cursor.execute("USE student_101")
# 关闭连接
cursor.close()
db.close()
注意:一定要记得关闭连接,否则会导致连接泄漏
3.2 学生名单导入实战
让我们实现将Excel学生名单导入MySQL的功能:
python复制from openpyxl import load_workbook
def import_students(file_path):
# 读取Excel文件
wb = load_workbook(file_path)
sheet = wb.active
# 连接数据库
db = pymysql.connect(host='localhost', user='root', password='123456')
cursor = db.cursor()
# 创建数据库和表
cursor.execute("CREATE DATABASE IF NOT EXISTS student_101")
cursor.execute("USE student_101")
cursor.execute("""
CREATE TABLE IF NOT EXISTS mingdan (
sno VARCHAR(20) PRIMARY KEY,
sname VARCHAR(50) NOT NULL
)
""")
# 插入数据
for row in sheet.iter_rows(min_row=2, values_only=True):
sno, sname = str(row[0]), str(row[1])
try:
cursor.execute("INSERT INTO mingdan VALUES (%s, %s)", (sno, sname))
except pymysql.err.IntegrityError:
print(f"学号{sno}已存在,跳过")
db.commit()
print(f"成功导入{sheet.max_row-1}条学生记录")
3.3 数据查询与导出
将数据库中的数据查询出来并转为字典:
python复制def export_to_dict():
db = pymysql.connect(host='localhost', user='root',
password='123456', database='student_101')
cursor = db.cursor()
cursor.execute("SELECT sno, sname FROM mingdan")
results = cursor.fetchall()
student_dict = {sno: sname for sno, sname in results}
cursor.close()
db.close()
return student_dict
4. 成绩管理系统实现
4.1 成绩表设计与初始化
创建存储学生成绩的表结构:
python复制def init_score_table():
conn = pymysql.connect(host='localhost', user='root',
password='123456', database='student_101')
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS scores (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
chinese FLOAT,
math FLOAT,
english FLOAT,
computer FLOAT
)
""")
# 插入示例数据
sample_data = [
("张三", 88, 90, 98, 95),
("李四", 85, 92, 95, 98),
("王五", 89, 89, 90, 92),
("丁六", 82, 86, 89, 90)
]
cursor.executemany("""
INSERT INTO scores (name, chinese, math, english, computer)
VALUES (%s, %s, %s, %s, %s)
""", sample_data)
conn.commit()
conn.close()
4.2 使用Pandas进行数据分析
Pandas与MySQL的完美结合:
python复制import pandas as pd
def analyze_scores():
conn = pymysql.connect(host='localhost', user='root',
password='123456', database='student_101')
# 读取数据到DataFrame
df = pd.read_sql("SELECT * FROM scores", conn)
# 计算统计指标
df['平均分'] = df[['chinese', 'math', 'english', 'computer']].mean(axis=1)
df['最高分'] = df[['chinese', 'math', 'english', 'computer']].max(axis=1)
# 添加各科最高分行
max_scores = pd.DataFrame(df[['chinese', 'math', 'english', 'computer']].max()).T
max_scores['name'] = '最高分'
df = pd.concat([df, max_scores])
# 保存回数据库
df.to_sql('score_analysis', conn, if_exists='replace', index=False)
conn.close()
return df
5. 实战经验与技巧
5.1 数据库操作最佳实践
- 连接管理:
- 使用with语句自动关闭连接:
python复制with pymysql.connect(...) as conn:
with conn.cursor() as cursor:
cursor.execute(...)
- 批量插入优化:
python复制# 使用executemany提高批量插入效率
data = [(...), (...), ...]
cursor.executemany("INSERT ... VALUES (%s, %s)", data)
- 事务处理:
python复制try:
cursor.execute("...")
cursor.execute("...")
conn.commit()
except:
conn.rollback()
5.2 常见错误排查
- 连接失败:
- 检查MySQL服务是否运行
- 确认用户名密码正确
- 检查防火墙设置
- 编码问题:
- 连接时指定编码:
python复制conn = pymysql.connect(..., charset='utf8mb4')
- 数据类型不匹配:
- Python的None对应SQL的NULL
- 确保日期类型正确转换
5.3 性能优化建议
- 索引优化:
python复制cursor.execute("CREATE INDEX idx_name ON scores(name)")
- 分页查询:
python复制# 使用LIMIT实现分页
cursor.execute("SELECT * FROM scores LIMIT 10 OFFSET 20")
- 连接池:
python复制from DBUtils.PooledDB import PooledDB
pool = PooledDB(pymysql, 5, host='...', user='...', ...)
6. 项目扩展思路
这个基础框架可以进一步扩展为:
- Web版成绩管理系统:
- 使用Flask/Django开发前端界面
- 添加用户登录和权限控制
- 自动化报表系统:
- 定期生成成绩统计报表
- 自动发送邮件通知
- 数据可视化:
- 使用Matplotlib/Seaborn绘制成绩分布图
- 生成学生个人成绩趋势图
- 多数据源整合:
- 从多个Excel文件导入数据
- 合并不同班级的成绩数据
我在实际项目中总结的经验是,数据库操作的核心在于:
- 严谨的事务处理
- 合理的索引设计
- 定期的数据备份
- 清晰的表结构设计
