实训5 python连接mysql数据库

Python连接MySQL数据库实训手册


一、实训目的

  1. 掌握Python中连接MySQL数据库的基本方法。
  2. 学习使用Python操作MySQL数据库的增、删、改、查(CRUD)操作。
  3. 熟悉使用PyMySQLmysql-connector-python库进行数据库编程。
  4. 提高综合应用能力,为后续开发Web应用或数据处理项目打下基础。

二、实训环境准备

1. 软件环境

  • 操作系统:Windows / macOS / Linux
  • Python版本:3.6 及以上
  • 数据库:MySQL 5.7 或以上版本

2. 安装必备工具

(1)安装Python

确保已安装Python(建议使用Python 3.8+),

可通过命令行验证:

bash 复制代码
python --version
(2)安装MySQL数据库
(3)安装Python数据库驱动

在命令行中运行以下命令安装PyMySQL(推荐初学者使用):

bash 复制代码
pip install PyMySQL

若使用 mysql-connector-python,可运行:

bash 复制代码
pip 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语句是否正确,使用参数化查询避免注入

六、拓展知识

  1. 使用连接池(Connection Pool) 提升性能

    python 复制代码
    from DBUtils.PooledDB import PooledDB
    pool = PooledDB(pymysql, 5, host='localhost', user='root', password='123456', database='test_db')
  2. 异常处理优化:对数据库操作使用多重异常捕获。

  3. 自动提交与事务管理

    python 复制代码
    conn.autocommit(False)
    # 多条SQL一起提交
    conn.commit()  # 手动提交
  4. 防止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()
相关推荐
jnrjian2 小时前
text index 查看index column index定义 index 刷新频率 index视图
数据库·oracle
瀚高PG实验室2 小时前
审计策略修改
网络·数据库·瀚高数据库
zzzzls~2 小时前
Python 工程化: 用 Copier 打造“自我进化“的项目脚手架
开发语言·python·copier
言慢行善2 小时前
sqlserver模糊查询问题
java·数据库·sqlserver
韶博雅2 小时前
emcc24ai
开发语言·数据库·python
有想法的py工程师3 小时前
PostgreSQL 分区表排序优化:Append Sort 优化为 Merge Append
大数据·数据库·postgresql
喵了几个咪3 小时前
如何在 Superset Docker 容器中安装 MySQL 驱动
mysql·docker·容器·superset
He少年3 小时前
【基础知识、Skill、Rules和MCP案例介绍】
java·前端·python
AI_Claude_code3 小时前
ZLibrary访问困境方案四:利用Cloudflare Workers等边缘计算实现访问
javascript·人工智能·爬虫·python·网络爬虫·边缘计算·爬山算法