
简介这份课件面向正在系统学习Python编程、希望掌握数据库操作技能的初学者与进阶开发者是《Python从入门到精通》系列课程的第14章配套PPT聚焦Python与数据库交互这一核心应用场景。资源包内含1个PPT文件大小约465KB以图文与代码示例结合的方式讲解知识点便于课堂演示与自学翻阅。目前已有1555人学习下载具备一定的参考热度。课件围绕pymysql模块展开涵盖连接对象与游标对象的使用方法包括cursor、commit、rollback、close等连接管理操作以及execute、executemany、fetchone、fetchmany、fetchall等游标操作并给出连接MySQL的完整参数说明与示例代码。同时介绍了SQLite轻量级数据库的建库建表与增删改查流程帮助读者理解事务处理、结果集获取与字符编码设置等关键概念为后续网络爬虫、Web开发等实战场景打下数据持久化基础。1. 从一份 25 页课件说起Python 操作数据库到底要跨过几道坎很多人第一次接触「Python 操作数据库」场景都差不多手头有一份讲稿或者课件比如这份 25 页的《Python 从入门到精通》第 14 章翻完发现概念都懂真让自己写一段能跑的代码还是卡在环境、驱动、连接串、游标这几步上。这份课件本身讲的是入门路径但真正落地时读者要解决的是三个具体问题Python 怎么连上数据库、增删改查怎么写才不出错、数据量上来之后怎么不把内存撑爆。它适合刚学完 Python 基础语法、准备把脚本和真实数据打通的开发者也适合需要批量处理表格、做数据同步的运维和数据分析人员。这一章我不复述课件目录而是把「操作数据库」这件事拆成能照着敲、能排错的路径顺带把 python 安装、数据库增删改查、mysql 数据库修改结构这些高频搜索点揉进具体操作里。2. 选库与建连sqlite3、PyMySQL、SQLAlchemy 该怎么挑2.1 先想清楚你要连的是哪种数据库标题里说的是「操作数据库」但数据库不是一个东西。课件里通常会用 SQLite 做演示因为它零配置、单文件适合教学可一旦你要连公司内网的 MySQL、Oracle或者做数据同步选型就变了。我一般按三个维度判断数据放哪、并发多不多、要不要跨数据库迁移。SQLite 适合本地脚本、单机工具、临时缓存Python 标准库自带sqlite3不用装任何东西。MySQL 是 Web 后端和业务系统里最常见的Python 侧主流用PyMySQL或mysql-connector-python。如果你希望同一套代码以后能换数据库或者要定义表结构、做 ORM 映射那就上SQLAlchemy。至于向量数据库、TDengine 这类专用库属于特定场景入门阶段先不碰。方案适用场景安装方式是否需额外服务sqlite3本地脚本、教学、单机工具标准库自带否PyMySQL连 MySQL、做增删改查pip 安装是SQLAlchemy多数据库、ORM、表结构管理pip 安装视后端而定选型没有绝对对错关键是别用 SQLite 去扛高并发写入也别为了一个本地小工具去装一整套 MySQL。课件里用 SQLite 讲原理是对的但你真做项目时先确认数据库类型再选驱动。2.2 用 sqlite3 跑通第一条连接先看最小可运行版本。下面这段代码创建一个本地库、建表、插入一条数据、再查出来全程不需要任何外部服务。import sqlite3 # 连接数据库文件不存在会自动创建 conn sqlite3.connect(demo.db) # 创建游标所有 SQL 都通过它执行 cur conn.cursor() # 建表IF NOT EXISTS 避免重复执行报错 cur.execute( CREATE TABLE IF NOT EXISTS student ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, score REAL ) ) # 插入数据用占位符防止 SQL 注入 cur.execute(INSERT INTO student (name, score) VALUES (?, ?), (张三, 92.5)) # 提交事务不提交数据不会真正写入 conn.commit() # 查询 cur.execute(SELECT id, name, score FROM student) for row in cur.fetchall(): print(row) # 关闭游标和连接 cur.close() conn.close()逻辑说明connect拿到连接对象cursor是执行 SQL 的句柄execute执行语句commit提交事务fetchall取回全部结果。参数说明demo.db是数据库文件名可以换成绝对路径?是占位符SQLite 用问号MySQL 的 PyMySQL 用%s这点后面会踩坑。AUTOINCREMENT让 id 自增NOT NULL约束 name 不能为空。提示忘记commit是新手最常见的翻车点插入、更新、删除都必须提交查询不需要。2.3 连 MySQL 时连接串和驱动怎么配连 MySQL 要装驱动命令是pip install pymysql。如果你连 python 安装都还没搞定先去 python 官网下载安装包安装时勾选 Add Python to PATH再用python -m pip install pymysql装库这样能避开 pip 不在环境变量里的问题。import pymysql # 建立连接参数按实际环境替换 conn pymysql.connect( host127.0.0.1, # 数据库地址 port3306, # 默认端口 userroot, # 用户名 passwordyour_pwd, # 密码 databasetest_db, # 库名 charsetutf8mb4 # 字符集支持中文和 emoji ) cur conn.cursor() cur.execute(SELECT VERSION()) print(cur.fetchone()) cur.close() conn.close()逻辑说明pymysql.connect返回连接对象参数里charset一定要写utf8mb4否则中文可能乱码。参数说明host是数据库服务器地址本机就是 127.0.0.1port默认 3306database是你要操作的库必须已存在。执行完记得关连接长期不关会耗尽连接数。注意PyMySQL 的占位符是%s不是?。写错会直接抛语法错误这是从 SQLite 切过来最容易踩的坑。3. 增删改查落地参数化、事务和批量写入3.1 增删改查四条语句的标准写法增删改查是数据库操作的核心课件里通常只给单条示例但真实场景要处理参数、事务和返回值。下面用 PyMySQL 演示四条语句注意占位符和提交。import pymysql conn pymysql.connect(host127.0.0.1, userroot, passwordyour_pwd, databasetest_db, charsetutf8mb4) cur conn.cursor() # 增参数化插入避免拼接字符串 cur.execute(INSERT INTO student (name, score) VALUES (%s, %s), (李四, 88.0)) # 改更新指定记录 cur.execute(UPDATE student SET score %s WHERE name %s, (95.0, 李四)) # 查条件查询 cur.execute(SELECT id, name, score FROM student WHERE score %s, (80,)) print(cur.fetchall()) # 删删除指定记录 cur.execute(DELETE FROM student WHERE name %s, (李四,)) # 统一提交 conn.commit() cur.close() conn.close()逻辑说明四条语句都用了参数化execute的第二个参数是元组按顺序替换%s。参数说明更新和删除的WHERE条件必须写否则会改全表或清空表这是血泪经验。查询用fetchall取全部数据量大时改用fetchone逐条取。提示WHERE后面不写条件UPDATE和DELETE会作用于整张表生产环境执行前先用SELECT验证条件。3.2 事务控制什么时候该 commit什么时候该 rollback事务是保证数据一致性的手段。比如转账场景扣款和入账必须同时成功或同时失败。PyMySQL 默认不开自动提交需要手动commit出错时用rollback回滚。import pymysql conn pymysql.connect(host127.0.0.1, userroot, passwordyour_pwd, databasetest_db, charsetutf8mb4) try: cur conn.cursor() cur.execute(UPDATE account SET balance balance - 100 WHERE id %s, (1,)) cur.execute(UPDATE account SET balance balance 100 WHERE id %s, (2,)) conn.commit() # 两条都成功才提交 print(转账成功) except Exception as e: conn.rollback() # 任一步失败全部回滚 print(转账失败已回滚, e) finally: cur.close() conn.close()逻辑说明把多条写操作放进try全部执行完再commit一旦抛异常rollback撤销本次事务内的所有改动。参数说明balance是余额字段id是账户主键。这种写法在数据库并发锁场景下尤其重要能避免部分更新导致的数据不一致。3.3 批量写入executemany 和分页查询单条插入一万次会很慢批量写入用executemany。查询大表时不要一次fetchall用游标分批取。import pymysql conn pymysql.connect(host127.0.0.1, userroot, passwordyour_pwd, databasetest_db, charsetutf8mb4) cur conn.cursor() # 批量插入一次提交 data [(王五, 76.0), (赵六, 81.5), (孙七, 90.0)] cur.executemany(INSERT INTO student (name, score) VALUES (%s, %s), data) conn.commit() # 分页查询避免一次性加载全部数据 page_size 100 offset 0 while True: cur.execute(SELECT id, name, score FROM student LIMIT %s OFFSET %s, (page_size, offset)) rows cur.fetchall() if not rows: break for row in rows: print(row) offset page_size cur.close() conn.close()逻辑说明executemany把列表里的多条数据一次性发给数据库比循环execute快很多。分页查询用LIMIT和OFFSET控制每次取多少条适合数据同步和导出场景。参数说明page_size是每页条数offset是偏移量每次循环递增。数据量特别大时OFFSET越往后越慢可以考虑用主键范围查询替代。4. 避坑与排查连接、编码、占位符这些坑4.1 连接报错 2003 或 1045 怎么查现象运行代码抛pymysql.err.OperationalError: (2003, Cant connect to MySQL server)或(1045, Access denied)。原因2003 通常是地址、端口不对或者数据库服务没启动1045 是用户名或密码错误也可能是该用户没有从当前主机连接的权限。解决先用ping和telnet 127.0.0.1 3306确认网络和端口通不通再核对账号密码最后检查 MySQL 用户表里该用户的 host 是不是%或本机地址。别一上来就改代码先确认服务端状态。4.2 中文乱码charset 没设对现象插入的中文变成问号或乱码。原因连接字符集和表字符集不一致常见是连接用了utf8而表是utf8mb4或者根本没写charset。解决连接参数里显式写charsetutf8mb4建表时也用utf8mb4。如果历史数据已经乱码需要重新导入改字符集救不回来。4.3 占位符写错? 和 %s 混用现象从 SQLite 切到 MySQL代码报TypeError或 SQL 语法错误。原因SQLite 用?PyMySQL 用%s两者不通用。解决按驱动统一占位符SQLite 用?PyMySQL 用%s。如果 SQL 语句里本身有%比如LIKE %abc%在 PyMySQL 里要写成%%转义否则会被当成占位符。4.4 忘记关闭连接导致连接数耗尽现象程序跑一段时间后报Too many connections。原因每次操作都新建连接却不关闭连接池被占满。解决用try/finally保证close一定执行或者改用连接池。SQLAlchemy 自带连接池PyMySQL 可以配合DBUtils使用。养成「谁打开谁关闭」的习惯比事后排查省事得多。4.5 修改表结构时的锁表风险现象执行ALTER TABLE修改字段时线上写入被阻塞。原因MySQL 修改表结构会加锁大表上执行可能持续很久。解决先在测试库验证语句尽量在低峰期执行能加ALGORITHMINPLACE的语句优先用。涉及 mysql 数据库修改结构的操作永远先备份再动手后悔药不好买。5. 进阶技巧用 SQLAlchemy 把连接和表结构管起来5.1 为什么值得再学一层 ORM手写 SQL 能跑通增删改查但项目一大连接管理、表结构变更、多数据库适配就会变成负担。SQLAlchemy 把这些抽象出来用create_engine管连接池用declarative_base定义表用session做事务。它不是必须的但当你需要同时连 MySQL 和 SQLite或者要做数据同步、迁移时它能省掉大量重复代码。from sqlalchemy import create_engine, Column, Integer, String, Float from sqlalchemy.orm import declarative_base, sessionmaker # 连接串格式数据库类型驱动://用户:密码地址:端口/库名 engine create_engine(mysqlpymysql://root:your_pwd127.0.0.1:3306/test_db?charsetutf8mb4, pool_size5, max_overflow10) Base declarative_base() class Student(Base): __tablename__ student id Column(Integer, primary_keyTrue, autoincrementTrue) name Column(String(50), nullableFalse) score Column(Float) # 建表 Base.metadata.create_all(engine) # 创建会话 Session sessionmaker(bindengine) session Session() # 插入 session.add(Student(name周八, score85.0)) session.commit() # 查询 for s in session.query(Student).filter(Student.score 80).all(): print(s.id, s.name, s.score) session.close()逻辑说明create_engine里的连接串把驱动、账号、地址、库名和字符集串在一起pool_size控制连接池大小max_overflow是超出后允许临时创建的连接数。declarative_base让类映射到表session负责增删改查和事务。参数说明String(50)限制字段长度nullableFalse对应 NOT NULL。这套写法换数据库时只改连接串代码基本不动。5.2 一个验证连接是否可用的习惯我每次接手新环境第一件事不是写业务代码而是跑一段最小验证连上库、查版本、查一张表、打印字段。这样能在写业务前把驱动、字符集、权限问题全部暴露出来。下面这段可以直接复用。import pymysql def check_db(host, user, password, database): try: conn pymysql.connect(hosthost, useruser, passwordpassword, databasedatabase, charsetutf8mb4) cur conn.cursor() cur.execute(SELECT VERSION()) print(数据库版本, cur.fetchone()[0]) cur.execute(SHOW TABLES) print(表列表, cur.fetchall()) cur.close() conn.close() return True except Exception as e: print(连接失败, e) return False check_db(127.0.0.1, root, your_pwd, test_db)逻辑说明先查版本确认连上了再查表列表确认库选对了任何一步失败都能定位到具体环节。参数说明四个参数对应连接四要素换成实际值即可。这个习惯帮我省过很多次「代码没问题但环境不对」的排查时间。5.3 参数速查与我的收尾习惯把常用参数集中列一下方便对照。参数作用常见取值charset连接字符集utf8mb4pool_size连接池常驻连接数5max_overflow临时连接上限10autocommit是否自动提交Falsecursorclass游标返回类型DictCursor我自己的习惯是任何写操作前先SELECT验证条件任何表结构变更前先备份任何新环境先跑连接验证脚本。数据库操作没有玄学出问题基本都是连接、字符集、占位符、事务这四类。把这几处守住剩下的就是熟练度问题。希望帮到你。本文还有配套的精品资源点击获取