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

张开发
2026/4/12 12:51:24 15 分钟阅读

分享文章

PyMySQL 详解:从入门到实战,Python 操作 MySQL 一站式指南
在 Python 开发中操作 MySQL 数据库是最常见的需求之一。PyMySQL是纯 Python 实现的 MySQL 客户端库完全兼容 MySQL 协议无需安装额外依赖上手简单、适配性强是 Python 操作 MySQL 的首选工具。本文将从安装、核心概念、基础操作、进阶用法、实战案例、异常处理全维度讲解 PyMySQL帮你彻底掌握 Python 与 MySQL 的交互。一、PyMySQL 基础认知1. 什么是 PyMySQLPyMySQL 是遵循Python DB API 2.0规范的 MySQL 驱动纯 Python 编写支持 Python 3.x 版本完美替代旧版MySQLdb支持 MySQL 5.5、MariaDB 等主流数据库。2. 核心优势纯 Python 实现跨平台Windows/Linux/Mac通用安装简单无系统依赖兼容 MySQL 官方协议支持事务、存储过程、批量操作语法简洁学习成本低二、环境安装首先确保已安装 Python 环境直接通过pip安装 PyMySQL# 安装最新版 PyMySQLpipinstallpymysql# 验证安装无报错即成功pip show pymysql三、核心概念必看1. 掌握 4 个核心对象Connection连接对象建立 Python 与 MySQL 服务器的连接管理会话、事务。Cursor游标对象执行 SQL 语句、获取查询结果的核心工具。事务MySQL 默认支持事务增删改操作需手动提交 / 回滚。关闭资源操作完成后必须关闭游标 关闭连接避免资源泄漏。每次写分六大步骤提前写好注释导包创建连接获取游标游标执行 sql 语句关闭游标关闭连接2. 本文统一数据库配置全程使用你只需要修改自己的 MySQL 账号密码即可# 数据库固定配置HOSTlocalhostPORT3306USERroot# 你的MySQL用户名PASSWORD123456# 你的MySQL密码DATABASEstudent_db# 我们要创建的数据库CHARSETutf8mb4四、数据库的创建及增删改查一第一步创建数据库 表 插入 20 条测试数据知识点 1连接 MySQL 服务器使用pymysql\.connect\(\)创建连接对象初始可以不指定数据库先连接服务器操作完成必须关闭连接 / 游标释放资源知识点 2创建数据库 数据表执行创建类 SQLCREATE直接用cursor\.execute\(\)无需commitDDL 语句自动提交这里注意起的文件名和导入的模块名不要一致Python 优先加载自己写的这个文件而不是真正的第三方库执行代码一键生成测试环境importpymysql# 1. 连接MySQL服务器不指定数据库connpymysql.connect(hostlocalhost,# ip地址port3306,# 端口号固定userroot,# 用户名填自己的passwordroot,# 密码填自己的charsetutf8# 字符集固定)cursorconn.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_insertINSERT 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 是这样拼接的usernameinput(请输入用户名)passwordinput(请输入密码)sqlfSELECT * FROM user WHERE name{username} AND pwd{password}正常情况用户名tom 密码123456执行SELECT*FROMuserWHEREnametomANDpwd1234563. 被 SQL 注入后会怎样坏人在用户名输入框里填tom OR 11 --拼接后 SQL 变成SELECT*FROMuserWHEREnametomOR11-- AND pwd结果11永远成立--是注释后面的密码判断直接失效→不用密码也能登录成功这就是SQL 注入攻击。4. SQL 注入能造成什么危害绕过登录直接进入系统查看、修改、删除整个数据库的数据删库跑路DROP TABLE获取敏感信息手机号、密码、身份证5. pymysql 怎么防止 SQL 注入核心不要字符串拼接使用参数化查询占位符 %s错误写法会注入sqlfSELECT * FROM user WHERE name{name} AND pwd{pwd}cursor.execute(sql)正确写法防注入sqlSELECT * FROM user WHERE name%s AND pwd%scursor.execute(sql,(name,pwd))pymysql 会自动转义特殊字符把用户输入当成值而不是 SQL 指令。6. 一句话总结SQL 注入就是用户输入被当成 SQL 代码执行了。解决方法永远用参数化查询不要手动拼接 SQL。所以后续都用参数化查询–二基础操作 1查询数据最常用知识点 3查询三剑客fetchone\(\)取1 条结果fetchmany\(n\)取n 条结果fetchall\(\)取全部结果推荐使用字典游标结果是字典可读性极高实例 1查询数据不安全方式仅演示# 1. 导包importpymysql# 2. 创建连接connpymysql.connect(hostlocalhost,port3306,userroot,passwordroot,databasestudent_db,charsetutf8)# 3. 获取游标my_cursorconn.cursor()# 4. 执行 sql 语句rowmy_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. 导包importpymysql# 2. 创建连接connpymysql.connect(hostlocalhost,port3306,userroot,passwordroot,databasestudent_db,charsetutf8)# 3. 获取游标my_cursorconn.cursor()# 4. 执行 sql 语句sqlSELECT * FROM student_db.student WHERE id%smy_cursor.execute(sql,(1,))# fetchone 一次拿一条数据print(my_cursor.fetchone())# 5. 关闭游标my_cursor.close()# 6. 关闭连接conn.close()实例 3查询所有学生数据# 1. 导包importpymysql# 2. 创建连接connpymysql.connect(hostlocalhost,port3306,userroot,passwordroot,databasestudent_db,charsetutf8)# 3. 获取游标my_cursorconn.cursor()# 4. 执行 sql 语句sqlSELECT * FROM student_db.studentmy_cursor.execute(sql)# 查询所有学生data_listmy_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. 导包importpymysql# 2. 创建连接connpymysql.connect(hostlocalhost,port3306,userroot,passwordroot,databasestudent_db,charsetutf8)# 3. 创建游标my_cursorconn.cursor()# 4. 执行 sql 操作# 增加数据经常出错容易出错的语句和try...except结合sqlINSERT 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. 导包importpymysql# 2. 创建连接connpymysql.connect(hostlocalhost,port3306,userroot,passwordroot,databasestudent_db,charsetutf8)# 3. 创建游标my_cursorconn.cursor()# 4. 执行 sql 操作# 增加数据经常出错容易出错的语句和try...except结合sqlUPDATE student_db.student SET score%s WHERE name%sdata(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删除 id21 的学生# 1. 导包importpymysql# 2. 创建连接connpymysql.connect(hostlocalhost,port3306,userroot,passwordroot,databasestudent_db,charsetutf8)# 3. 创建游标my_cursorconn.cursor()# 4. 执行 sql 操作# 增加数据经常出错容易出错的语句和try...except结合sqlDELETE FROM student_db.student WHERE id%stry: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. 导包importpymysqlfrompymysql.cursorsimportDictCursor# 2. 创建连接withpymysql.connect(hostlocalhost,port3306,userroot,passwordroot,databasestudent_db,charsetutf8)asconn:# 3. 创建游标withconn.cursor(DictCursor)asmy_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 条数据每一个知识点都对应一个可运行实例查询、插入、更新、删除、统计全覆盖生产环境可用的安全写法 事务控制

更多文章