Python连接MySQL数据库实训手册
一、实训目的
- 掌握Python中连接MySQL数据库的基本方法。
- 学习使用Python操作MySQL数据库的增、删、改、查(CRUD)操作。
- 熟悉使用
PyMySQL或mysql-connector-python库进行数据库编程。 - 提高综合应用能力,为后续开发Web应用或数据处理项目打下基础。
二、实训环境准备
1. 软件环境
- 操作系统:Windows / macOS / Linux
- Python版本:3.6 及以上
- 数据库:MySQL 5.7 或以上版本
2. 安装必备工具
(1)安装Python
确保已安装Python(建议使用Python 3.8+),
可通过命令行验证:
bash
python --version
(2)安装MySQL数据库
- 下载地址:https://dev.mysql.com/downloads/mysql/
- 安装完成后,启动MySQL服务并设置root用户密码。
(3)安装Python数据库驱动
在命令行中运行以下命令安装PyMySQL(推荐初学者使用):
bash
pip install PyMySQL
若使用
mysql-connector-python,可运行:
bashpip install mysql-connector-python
三、准备工作:创建测试数据库与表
1. 登录MySQL并创建数据库
打开命令行,输入以下命令登录MySQL:
bash
mysql -u root -p
输入密码后进入MySQL命令行,执行如下SQL语句:
sql
-- 创建数据库
CREATE DATABASE IF NOT EXISTS test_db;
-- 使用数据库
USE test_db;
-- 创建学生表
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT,
gender VARCHAR(10),
grade DECIMAL(5,2)
);
-- 插入测试数据
INSERT INTO students (name, age, gender, grade) VALUES
('张三', 20, '男', 85.5),
('李四', 19, '女', 92.0),
('王五', 21, '男', 78.5);
四、Python连接MySQL操作实践
项目结构建议
mysql_practice/
│
├── connection.py # 数据库连接与操作
├── create_table.py # 创建表
├── insert_data.py # 插入数据
├── query_data.py # 查询数据
├── update_data.py # 更新数据
└── delete_data.py # 删除数据
实训1:连接MySQL数据库(connection.py)
python
# connection.py
import pymysql
def connect_to_mysql():
try:
# 数据库连接参数
connection = pymysql.connect(
host='localhost', # MySQL服务器地址
user='root', # 数据库用户名
password='your_password', # 数据库密码(请替换为实际密码)
database='test_db', # 要连接的数据库名
charset='utf8mb4', # 支持中文
cursorclass=pymysql.cursors.DictCursor # 返回字典格式结果
)
print("数据库连接成功!")
return connection
except Exception as e:
print(f"数据库连接失败:{e}")
return None
# 主程序测试
if __name__ == "__main__":
conn = connect_to_mysql()
if conn:
conn.close()
✅ 重要提示:将
'your_password'替换为你实际设置的MySQL root密码。
实训2:插入数据(insert_data.py)
python
# insert_data.py
import pymysql
def insert_student(name, age, gender, grade):
conn = pymysql.connect(
host='localhost',
user='root',
password='your_password',
database='test_db',
charset='utf8mb4'
)
try:
with conn.cursor() as cursor:
sql = "INSERT INTO students (name, age, gender, grade) VALUES (%s, %s, %s, %s)"
cursor.execute(sql, (name, age, gender, grade))
conn.commit()
print(f"成功插入学生:{name}")
except Exception as e:
print(f"插入失败:{e}")
conn.rollback()
finally:
conn.close()
# 测试插入
if __name__ == "__main__":
insert_student("赵六", 20, "女", 88.0)
实训3:查询数据(query_data.py)
python
# query_data.py
import pymysql
def query_students():
conn = pymysql.connect(
host='localhost',
user='root',
password='your_password',
database='test_db',
charset='utf8mb4'
)
try:
with conn.cursor() as cursor:
sql = "SELECT * FROM students"
cursor.execute(sql)
results = cursor.fetchall()
print("查询结果:")
for row in results:
print(f"ID: {row['id']}, 姓名: {row['name']}, 年龄: {row['age']}, 性别: {row['gender']}, 成绩: {row['grade']}")
except Exception as e:
print(f"查询失败:{e}")
finally:
conn.close()
# 执行查询
if __name__ == "__main__":
query_students()
实训4:更新数据(update_data.py)
python
# update_data.py
import pymysql
def update_student(name, new_grade):
conn = pymysql.connect(
host='localhost',
user='root',
password='your_password',
database='test_db',
charset='utf8mb4'
)
try:
with conn.cursor() as cursor:
sql = "UPDATE students SET grade = %s WHERE name = %s"
affected_rows = cursor.execute(sql, (new_grade, name))
conn.commit()
if affected_rows > 0:
print(f"成功更新学生 {name} 的成绩为 {new_grade}")
else:
print(f"未找到学生 {name}")
except Exception as e:
print(f"更新失败:{e}")
conn.rollback()
finally:
conn.close()
# 测试更新
if __name__ == "__main__":
update_student("张三", 90.0)
实训5:删除数据(delete_data.py)
python
# delete_data.py
import pymysql
def delete_student(name):
conn = pymysql.connect(
host='localhost',
user='root',
password='your_password',
database='test_db',
charset='utf8mb4'
)
try:
with conn.cursor() as cursor:
sql = "DELETE FROM students WHERE name = %s"
affected_rows = cursor.execute(sql, (name,))
conn.commit()
if affected_rows > 0:
print(f"成功删除学生:{name}")
else:
print(f"未找到学生 {name}")
except Exception as e:
print(f"删除失败:{e}")
conn.rollback()
finally:
conn.close()
# 测试删除
if __name__ == "__main__":
delete_student("王五")
五、常见问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server") |
网络或MySQL未启动 | 检查MySQL服务是否运行,防火墙是否阻止 |
Access denied for user 'root'@'localhost' |
用户名/密码错误 | 检查密码,或重置root密码 |
Unknown database 'test_db' |
数据库不存在 | 使用SQL命令创建数据库 |
UnicodeEncodeError: 'charmap' codec can't encode |
编码问题 | 使用 charset='utf8mb4' |
SyntaxError |
SQL语法错误 | 检查SQL语句是否正确,使用参数化查询避免注入 |
六、拓展知识
-
使用连接池(Connection Pool) 提升性能
pythonfrom DBUtils.PooledDB import PooledDB pool = PooledDB(pymysql, 5, host='localhost', user='root', password='123456', database='test_db') -
异常处理优化:对数据库操作使用多重异常捕获。
-
自动提交与事务管理:
pythonconn.autocommit(False) # 多条SQL一起提交 conn.commit() # 手动提交 -
防止SQL注入 :始终使用参数化查询(
%s占位符)。
七、实训总结与评分标准(可选)
| 项目 | 分值 | 说明 |
|---|---|---|
| 环境准备 | 10分 | 正确安装Python、MySQL、驱动 |
| 数据库连接 | 15分 | 成功连接并输出提示 |
| 数据增删改查 | 40分 | 每项操作完整、正确 |
| 代码规范 | 15分 | 有注释、模块化、命名规范 |
| 问题排查 | 10分 | 能正确处理异常与错误 |
| 总分 | 100分 |
八、附录:快速入门总结
- 使用
pymysql.connect()建立连接。 - 使用
cursor().execute(sql, params)执行SQL。 - 使用
conn.commit()提交事务。 - 使用
conn.close()关闭连接。 - 所有参数必须使用
%s占位符,防止SQL注入。
实训完成提示:
所有脚本运行成功,数据查询正确,无异常报错,即为实训完成!
python
import pymysql
def connect_to_mysql():
try:
# 数据库连接参数
connection = pymysql.connect(
host='localhost', # MySQL服务器地址
user='root', # 数据库用户名
password='root', # 数据库密码(请替换为实际密码)
database='test_db', # 要连接的数据库名
charset='utf8mb4', # 支持中文
)
print("数据库连接成功!")
return connection
except Exception as e:
print(f"数据库连接失败:{e}")
return None
def insert_student(name, age, gender, grade):
sql = "INSERT INTO students (name, age, gender, grade) VALUES (%s, %s, %s, %s)"
cursor.execute(sql, (name, age, gender, grade))
conn.commit()
print(f"成功插入学生:{name}")
def query_students():
sql = "SELECT * FROM students"
cursor.execute(sql)
results = cursor.fetchall()
# print(results)
print("查询结果:")
for row in results:
print(f"ID: {row[0]}, 姓名: {row[1]}, 年龄: {row[2]}, 性别: {row[3]}, 成绩: {row[4]}")
def delete_student(name):
sql = "DELETE FROM students WHERE name = %s"
affected_rows = cursor.execute(sql, (name,))
conn.commit()
if affected_rows > 0:
print(f"成功删除学生:{name}")
else:
print(f"未找到学生 {name}")
def update_student(name,new_grade):
sql = "update students set grade = %s where name = %s"
affected_rows = cursor.execute(sql,(new_grade,name))
conn.commit()
if affected_rows > 0:
print(f"成功更新学生{name}的成绩为{new_grade}")
else:
print(f"未找到可以修改的学生{name}")
# 主程序测试
if __name__ == "__main__":
conn = connect_to_mysql()
try:
with conn.cursor() as cursor:
insert_student("赵六", 20, "女", 88.0)
query_students()
delete_student("赵六")
update_student("李四",99.8)
query_students()
except Exception as e:
print(f"失败:{e}")
conn.rollback()
finally:
conn.close()