Python操作数据库实战:从sqlite3到PyMySQL与SQLAlchemy
简介这份课件面向正在系统学习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验证条件任何表结构变更前先备份任何新环境先跑连接验证脚本。数据库操作没有玄学出问题基本都是连接、字符集、占位符、事务这四类。把这几处守住剩下的就是熟练度问题。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

RoboMaster硬件基础讲义V0.2.1拆解:嵌入式与电机驱动实战指南

RoboMaster硬件基础讲义V0.2.1拆解:嵌入式与电机驱动实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 4:19:34 阅读更多 →
图书管理系统需求分析报告怎么写:从用例图到非功能需求的完整落地指南

图书管理系统需求分析报告怎么写:从用例图到非功能需求的完整落地指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 4:19:34 阅读更多 →
宽温磁环电感失效机理与EMC可靠性验证实战解析

宽温磁环电感失效机理与EMC可靠性验证实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 4:19:34 阅读更多 →

最新新闻

你的项目不是一次性的:vibe-vibe 迭代思维实战指南——从“做完“到“好用“

你的项目不是一次性的:vibe-vibe 迭代思维实战指南——从“做完“到“好用“

文档教程Vibe Coding示例工程 【免费下载链接】vibe-vibe The First Systematic Vibe Coding Open-Source Tutorial | From Zero to Full-Stack, Empowering Everyone to Build Products with AI | Live at: www.vibevibe.cn ;首个系统化 Vibe Coding 开源教程 | 零…

2026/10/12 5:47:24 阅读更多 →
Openblocks Drawer 抽屉组件实战:布局定位、尺寸控制与 openDrawer/closeDrawer 事件触发

Openblocks Drawer 抽屉组件实战:布局定位、尺寸控制与 openDrawer/closeDrawer 事件触发

低代码后端前端开发工具 【免费下载链接】openblocks 🔥 🔥 🔥 The Open Source Retool Alternative 项目地址: https://gitcode.com/gh_mirrors/op/openblocks 点击查看 免费下载 Drawer(抽屉)是 Openblo…

2026/10/12 5:47:24 阅读更多 →
Unsloth 3行代码微调:合成数据质量把控与实战指南

Unsloth 3行代码微调:合成数据质量把控与实战指南

直接正文开始。1. 为什么要用合成数据微调,以及为什么是Unsloth做微调这件事,最大的成本往往不是机器,而是数据。很多人一上来就到处找数据集,或者手工标注几百条样本,结果发现任务本身太垂直,公开数据根本…

2026/10/12 5:47:24 阅读更多 →
掉地面包背后:烘焙食安全链条拆解与门店现场管理落地

掉地面包背后:烘焙食安全链条拆解与门店现场管理落地

一家开了五年的连锁面包店,因为一段“员工把掉在地上的面包捡起来放回货架”的视频,一夜之间登上热搜,总部电话被打爆,门店营业额当周腰斩。这类事这几年并不少见,每次出现都会让整个烘焙行业跟着紧张一次。你可能会觉…

2026/10/12 5:47:24 阅读更多 →
C语言联合体与枚举:从内存利用到类型安全的实战指南

C语言联合体与枚举:从内存利用到类型安全的实战指南

写之前先说实话,这个标题我一开始真以为是个什么网红食谱,结果点进去才发现是个C语言的自定义类型话题。“嘎嘎滴辣虾”这个开场相当有迷惑性,但顺着这个味儿,今天这篇就想跟大伙儿聊聊联合体(union)和枚举…

2026/10/12 5:47:24 阅读更多 →
C++肉鸽游戏开发:随机地图生成与回合制AI实战解析

C++肉鸽游戏开发:随机地图生成与回合制AI实战解析

简介:由C与EasyX图形库实现的肉鸽游戏Slime-Hunter,是作者22级技科专业课程设计作品。游戏内含角色控制、敌人攻击动画与基础关卡机制,虽为中期版本,但核心玩法已具备完整雏形,适合正在学习C游戏开发的初学者参考。资源…

2026/10/12 5:46:23 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →