欢迎光临
我们一直在努力

PyMySQL 详解:从入门到实战,Python 操作 MySQL 一站式指南

在 Python 开发中,操作 MySQL 数据库是最常见的需求之一。PyMySQL 是纯 Python 实现的 MySQL 客户端库,完全兼容 MySQL 协议,无需安装额外依赖,上手简单、适配性强,是 Python 操作 MySQL 的首选工具。

本文将从安装、核心概念、基础操作、进阶用法、实战案例、异常处理全维度讲解 PyMySQL,帮你彻底掌握 Python 与 MySQL 的交互。

一、PyMySQL 基础认知

1. 什么是 PyMySQL?

PyMySQL 是遵循 Python DB API 2.0 规范的 MySQL 驱动,纯 Python 编写,支持 Python 3.x 版本,完美替代旧版 MySQLdb,支持 MySQL 5.5+、MariaDB 等主流数据库。

2. 核心优势

  • 纯 Python 实现,跨平台(Windows/Linux/Mac)通用

  • 安装简单,无系统依赖

  • 兼容 MySQL 官方协议,支持事务、存储过程、批量操作

  • 语法简洁,学习成本低

二、环境安装

首先确保已安装 Python 环境,直接通过 pip 安装 PyMySQL:

# 安装最新版 PyMySQL
pip install pymysql

# 验证安装(无报错即成功)
pip show pymysql

三、核心概念(必看)

1. 掌握 4 个核心对象:

  • Connection(连接对象):建立 Python 与 MySQL 服务器的连接,管理会话、事务。

  • Cursor(游标对象):执行 SQL 语句、获取查询结果的核心工具。

  • 事务:MySQL 默认支持事务,增删改操作需手动提交 / 回滚。

  • 关闭资源:操作完成后必须关闭游标 + 关闭连接,避免资源泄漏。

  • 每次写分六大步骤,提前写好注释:

  • 导包
  • 创建连接
  • 获取游标
  • 游标执行 sql 语句
  • 关闭游标
  • 关闭连接
  • 2. 本文统一数据库配置(全程使用)

    你只需要修改自己的 MySQL 账号密码即可:

    # 数据库固定配置
    HOST = 'localhost'
    PORT = 3306
    USER = 'root' # 你的MySQL用户名
    PASSWORD = '123456' # 你的MySQL密码
    DATABASE = 'student_db' # 我们要创建的数据库
    CHARSET = 'utf8mb4'


    四、数据库的创建及增删改查

    (一)第一步:创建数据库 + 表 + 插入 20 条测试数据

    知识点 1:连接 MySQL 服务器

    • 使用 pymysql\\.connect\\(\\) 创建连接对象

    • 初始可以不指定数据库,先连接服务器

    • 操作完成必须关闭连接 / 游标,释放资源

    知识点 2:创建数据库 + 数据表

    • 执行创建类 SQL(CREATE)直接用 cursor\\.execute\\(\\)

    • 无需 commit(DDL 语句自动提交)

    • 这里注意:起的文件名和导入的模块名不要一致!!!Python 优先加载自己写的这个文件,而不是真正的第三方库在这里插入图片描述

    执行代码:一键生成测试环境

    import pymysql

    # 1. 连接MySQL服务器(不指定数据库)
    conn = pymysql.connect(
    host='localhost', # ip地址
    port=3306, # 端口号固定
    user='root', # 用户名:填自己的
    password='root', # 密码:填自己的
    charset='utf8' # 字符集固定
    )
    cursor = conn.cursor()

    # 2. 创建数据库
    cursor.execute("CREATE DATABASE IF NOT EXISTS student_db DEFAULT CHARACTER SET utf8mb4")

    # 4. 创建学生表(id、姓名、年龄、性别、班级、成绩)
    sql_create_table = """
    CREATE TABLE IF NOT EXISTS student_db.student (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    age INT,
    gender CHAR(1),
    class VARCHAR(10),
    score DECIMAL(5,2)
    )
    """

    cursor.execute(sql_create_table)

    # 5. 插入20条固定测试数据
    students = [
    ("张三", 18, "男", "一班", 88.5),
    ("李四", 19, "男", "一班", 76.0),
    ("王五", 18, "女", "一班", 92.0),
    ("赵六", 20, "男", "二班", 65.5),
    ("钱七", 19, "女", "二班", 89.0),
    ("孙八", 18, "男", "二班", 78.5),
    ("周九", 19, "女", "三班", 95.0),
    ("吴十", 20, "男", "三班", 82.0),
    ("郑十一", 18, "女", "三班", 70.0),
    ("王十二", 19, "男", "四班", 86.5),
    ("李十三", 20, "女", "四班", 91.0),
    ("张十四", 18, "男", "四班", 69.5),
    ("刘十五", 19, "女", "一班", 77.0),
    ("陈十六", 20, "男", "二班", 84.0),
    ("杨十七", 18, "女", "三班", 93.5),
    ("黄十八", 19, "男", "四班", 60.0),
    ("秦十九", 20, "女", "一班", 81.5),
    ("鲁二十", 18, "男", "二班", 73.0),
    ("齐二一", 19, "女", "三班", 87.0),
    ("宋二二", 20, "男", "四班", 90.0)
    ]

    # 批量插入
    sql_insert = "INSERT INTO student_db.student(name,age,gender,class,score) VALUES(%s,%s,%s,%s,%s)"
    cursor.executemany(sql_insert, students)
    conn.commit() # 插入必须提交

    # 关闭资源
    cursor.close()
    conn.close()
    print("✅ 数据库、表、20条测试数据创建完成!")

    运行后,你就拥有了:

    • 数据库:student_db

    • 表:student

    • 数据:20 条学生信息(id 1~20)

    后续所有操作都基于这套数据!


    拓展数据注入问题

    1. SQL 注入是什么?(用最简单的话讲清楚)

    SQL 注入 = 坏人利用你写得不严谨的 SQL 语句,偷偷插入恶意 SQL 代码,让数据库执行他想干的事。
    本质原因:
    你把用户输入的内容直接拼接到 SQL 字符串里,没有做任何过滤,数据库就把用户输入当成 SQL 指令执行了。


    2. 举个最经典的例子:登录验证

    假设你写的登录 SQL 是这样拼接的:

    username = input("请输入用户名:")
    password = input("请输入密码:")

    sql = f"SELECT * FROM user WHERE name='{username}' AND pwd='{password}'"

    正常情况:

    用户名:tom
    密码:123456

    执行:

    SELECT * FROM user WHERE name='tom' AND pwd='123456'


    3. 被 SQL 注入后会怎样?

    坏人在用户名输入框里填:

    tom' OR 1=1 —

    拼接后 SQL 变成:

    SELECT * FROM user WHERE name='tom' OR 1=1 –' AND pwd=''

    结果:

    • 1=1 永远成立
    • — 是注释,后面的密码判断直接失效
      → 不用密码也能登录成功!

    这就是 SQL 注入攻击。


    4. SQL 注入能造成什么危害?

  • 绕过登录,直接进入系统
  • 查看、修改、删除整个数据库的数据
  • 删库跑路(DROP TABLE)
  • 获取敏感信息(手机号、密码、身份证)

  • 5. pymysql 怎么防止 SQL 注入?

    核心:不要字符串拼接,使用参数化查询(占位符 %s)

    错误写法(会注入):

    sql = f"SELECT * FROM user WHERE name='{name}' AND pwd='{pwd}'"
    cursor.execute(sql)

    正确写法(防注入):

    sql = "SELECT * FROM user WHERE name=%s AND pwd=%s"
    cursor.execute(sql, (name, pwd))

    pymysql 会自动转义特殊字符,把用户输入当成值,而不是 SQL 指令。


    6. 一句话总结

    SQL 注入就是用户输入被当成 SQL 代码执行了。
    解决方法:永远用参数化查询,不要手动拼接 SQL。
    所以后续都用参数化查询

    (二)基础操作 1:查询数据(最常用)

    知识点 3:查询三剑客

  • fetchone\\(\\):取1 条结果

  • fetchmany\\(n\\):取 n 条结果

  • fetchall\\(\\):取全部结果

  • 推荐使用字典游标,结果是字典,可读性极高


  • 实例 1:查询数据(不安全方式,仅演示)

    # 1. 导包
    import pymysql

    # 2. 创建连接
    conn = pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='root',
    database='student_db',
    charset='utf8'
    )

    # 3. 获取游标
    my_cursor = conn.cursor()

    # 4. 执行 sql 语句
    row = my_cursor.execute("SELECT * FROM student_db.student")
    print(f'影响了{row}行')

    # fetchone 一次拿一条数据
    print(my_cursor.fetchone())
    print(my_cursor.fetchone())

    # fetchmany(n):接着上面数据继续往下取n条(元组形式)
    print(my_cursor.fetchmany(5))

    # fetchall: 取剩下的所有数据(元组形式)
    print(my_cursor.fetchall())

    在这里插入图片描述

    实例 2 查询单条数据(安全方式)

    # 1. 导包
    import pymysql

    # 2. 创建连接
    conn = pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='root',
    database='student_db',
    charset='utf8'
    )

    # 3. 获取游标
    my_cursor = conn.cursor()

    # 4. 执行 sql 语句
    sql = "SELECT * FROM student_db.student WHERE id=%s"
    my_cursor.execute(sql, (1, ))

    # fetchone 一次拿一条数据
    print(my_cursor.fetchone())

    # 5. 关闭游标
    my_cursor.close()

    # 6. 关闭连接
    conn.close()

    实例 3:查询所有学生数据

    # 1. 导包
    import pymysql

    # 2. 创建连接
    conn = pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='root',
    database='student_db',
    charset='utf8'
    )

    # 3. 获取游标
    my_cursor = conn.cursor()

    # 4. 执行 sql 语句
    sql = "SELECT * FROM student_db.student"
    my_cursor.execute(sql)
    # 查询所有学生
    data_list = my_cursor.fetchall()
    print("📌 所有学生数据(共%d条):" % len(data_list))

    # 5. 关闭游标
    my_cursor.close()

    # 6. 关闭连接
    conn.close()


    (三)基础操作 2:插入数据

    知识点 4:插入规则

  • 必须用 %s 占位符(防 SQL 注入)

  • 必须执行 conn.commit() 才会真正写入

  • 出错用 conn.rollback() 回滚

  • 拓展:① 事务,要么都成功, 要么都失败(特性:原子性、一致性、隔离性、持久性)
    ② 存储引擎: innodb支持事务, myisam不支持事务
    ③ 增删改操作:如果数据库底层是 innodb 引擎,必须手动commit提交
    ④ 数据提交:commit()
    ⑤ 数据回滚:rollback()
    ⑥ 数据提交及数据回滚常常和try…except…结合使用


    实例 4:插入 1 条新学生

    # 1. 导包
    # 1. 导包
    import pymysql
    # 2. 创建连接
    conn = pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='root',
    database='student_db',
    charset='utf8'
    )
    # 3. 创建游标
    my_cursor = conn.cursor()

    # 4. 执行 sql 操作
    # 增加数据经常出错,容易出错的语句和try…except结合
    sql = "INSERT INTO student_db.student(name, age, gender, class, score) VALUES (%s,%s,%s,%s,%s)"
    data = ('小刘', 18, '男', '五班', 85.0)
    try:
    my_cursor.execute(sql, data)
    # 插入成功提交
    conn.commit()
    print("✅ 插入成功,新id:", my_cursor.lastrowid)
    except:
    # 插入失败回滚
    conn.rollback()
    print("❌ 插入失败")

    # 5. 关闭游标
    my_cursor.close()
    # 6. 关闭连接
    conn.close()


    (四)基础操作 3:更新数据

    知识点 5:更新注意事项

    • 一定要加 WHERE 条件,否则会全表更新

    • 同样需要 commit / rollback


    实例 5:把张三的成绩改成 100 分

    # 1. 导包
    import pymysql
    # 2. 创建连接
    conn = pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='root',
    database='student_db',
    charset='utf8'
    )
    # 3. 创建游标
    my_cursor = conn.cursor()

    # 4. 执行 sql 操作
    # 增加数据经常出错,容易出错的语句和try…except结合
    sql = "UPDATE student_db.student SET score=%s WHERE name=%s"
    data = (10.0, "张三")
    try:
    my_cursor.execute(sql, data)
    # 插入成功提交
    conn.commit()
    print("✅ 修改成功,影响行数:", my_cursor.rowcount)
    except:
    # 插入失败回滚
    conn.rollback()
    print("❌ 更新失败")

    # 5. 关闭游标
    my_cursor.close()
    # 6. 关闭连接
    conn.close()


    (五)基础操作 4:删除数据

    知识点 6:删除规则

    • 必须加 WHERE,否则清空整张表

    • 同样需要事务提交


    实例 6:删除 id=21 的学生

    # 1. 导包
    import pymysql
    # 2. 创建连接
    conn = pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='root',
    database='student_db',
    charset='utf8'
    )
    # 3. 创建游标
    my_cursor = conn.cursor()

    # 4. 执行 sql 操作
    # 增加数据经常出错,容易出错的语句和try…except结合
    sql = "DELETE FROM student_db.student WHERE id=%s"
    try:
    my_cursor.execute(sql, (21, ))
    # 插入成功提交
    conn.commit()
    print("✅ 删除成功,影响行数:", my_cursor.rowcount)
    except:
    # 插入失败回滚
    conn.rollback()
    print("❌ 删除失败")

    # 5. 关闭游标
    my_cursor.close()
    # 6. 关闭连接
    conn.close()


    (六)最优雅写法:with 自动关闭连接(推荐)

    知识点 7:上下文管理器

    • with 会自动关闭连接和游标

    • 代码更简洁、更安全

    # 1. 导包
    import pymysql
    from pymysql.cursors import DictCursor
    # 2. 创建连接
    with pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='root',
    database='student_db',
    charset='utf8'
    ) as conn:
    # 3. 创建游标
    with conn.cursor(DictCursor) as my_cursor:
    # 4. 执行 sql 操作
    my_cursor.execute("SELECT id, name,score FROM student_db.student LIMIT 5")
    print(my_cursor.fetchall())


    总结:必须记住的 5 条铁律

  • 查询用字典游标,结果清晰

  • 增删改必须 commit,否则不生效

  • 出错必须 rollback,保证数据安全

  • 永远用 % s 传参,禁止拼接 SQL

  • 最后关闭连接,或用 with 自动关闭


  • 这篇文章你得到了:

  • 一套可直接使用的 MySQL 测试库(20 条数据)

  • 每一个知识点都对应一个可运行实例

  • 查询、插入、更新、删除、统计全覆盖

  • 生产环境可用的安全写法 + 事务控制

  • 赞(0)
    未经允许不得转载:171主机测评 » PyMySQL 详解:从入门到实战,Python 操作 MySQL 一站式指南
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址