前言FDE系列内容总纲【大纲】FDE 前沿部署工程师学习系列教程-CSDN博客前置课程列表见文档结尾附录。阶段2·Day 31SQL 基础 — 增删改查一把梭FDE 学习系列教程 · 第二阶段 · 第 3 周 · Day 1预计时长2.5 小时 | 难度★★☆☆☆ | 前置知识Python 基础、FastAPI CRUD一句话目标搞懂数据库是啥在 SQLite 里建表、插数据写出 SELECT / WHERE / ORDER BY / LIMIT把增删改查CRUD的骨架完整走一遍。‍‍ 开场你的数据终于有个正经家了兄弟前面两周你的工单数据全存在 Python 列表里TICKETS [{id: 1, title: 温度偏高}, {...}]发现问题了吗程序一关数据全没了。重启服务列表清空之前建的工单人间蒸发。这要是在客户现场第二天客户打开系统发现昨天录的 200 条工单没了你猜会不会被请去喝茶。真实项目里数据住在哪数据库Database。数据库听着高深其实你可以把它理解成一个**超级 Excel**表Table≈ Sheet工作表一行 ≈ 一条记录一列 ≈ 一个字段SQL ≈ 你跟这个超级 Excel 说话的语言区别在于Excel 几万行就卡数据库几千万行不慌Excel 一人编辑数据库支持成百上千人同时读写Excel 用 CtrlF 找数据数据库用 SQL 精确查询。 FDE 现场最常见的场景客户甩给你一个 Excel 导出的 CSV你把它导入数据库然后用 SQL 做分析、清洗、对接。今天学的就是这套流程的第一步。今天我们用SQLite上手——它是 Python 自带的零安装一个文件就是一个数据库最适合学习。周五再切换到企业标配的 MySQL。 一、三大数据库速览SQLite / MySQL / PostgreSQL先认识一下数据库家族的三兄弟别到时候客户说用啥你都没听过┌──────────────────────────────────────────────────────────────┐ │ SQLite 轻量级 │ │ · 一个 .db 文件就是一个完整数据库 │ │ · 零安装、零配置、Python 自带import sqlite3 │ │ · 适合学习、原型开发、手机 App、单机小工具 │ │ · 短板不支持多人高并发不适合做生产服务器 │ │ │ │ MySQL 最流行 │ │ · 开源、免费、性能好、生态最成熟 │ │ · 企业标配互联网公司十有八九在用 │ │ · 需要安装服务、配置账号密码 │ │ · 适合Web 应用后端、FDE 交付主战场 │ │ │ │ PostgreSQL 功能最强 │ │ · 开源界的学霸支持复杂查询、JSON、地理空间 │ │ · 近几年越来越火 │ │ · 学习曲线稍陡 │ │ · 适合复杂数据分析、金融、GIS │ └──────────────────────────────────────────────────────────────┘ 本周路线 Day31-34 用 SQLite 学语法免安装专注 SQL 本身 ↓ Day35 切换 MySQL接进真实项目语法 95% 通用核心认知SQL 是一门标准语言三大数据库的 SQL 语法 90% 以上相通。今天在 SQLite 学的SELECT ... WHERE ...到 MySQL、PostgreSQL 照样能用。换数据库主要是换连接方式不是重学一门语言。数据库 vs Excel 对照表对比项Excel数据库如 MySQL数据组织Sheet工作表Table表一行数据一行一条记录Record / Row一列一列一个字段Field / Column查找CtrlF / 筛选SQL 语句多表关联VLOOKUP写到崩溃JOIN清爽并发一人编辑别人只读成百上千人同时读写数据量几万行开始卡几千万行不慌数据安全删了就没了事务、备份、回滚️ 二、实操创建第一个 SQLite 数据库这块是基础常识懂的朋友直接跳过也行——不过第一次接触 sqlite3 的话跟着敲一遍心里踏实。步骤 1建好练习目录打开 VS Code在你的工作区新建一个文件夹sql_practice然后新建文件01_create_db.py。步骤 2写代码建库建表 创建第一个 SQLite 数据库 文件01_create_db.py import sqlite3 # ① 连接数据库 # 文件不存在会自动创建存在就直接打开 conn sqlite3.connect(fde_workshop.db) cursor conn.cursor() # cursor游标是执行 SQL 的遥控器 # ② 建表设备信息表 # IF NOT EXISTS 表不存在才建已存在就跳过防止重复运行报错 cursor.execute( CREATE TABLE IF NOT EXISTS devices ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, type TEXT NOT NULL, temperature REAL DEFAULT 0, vibration REAL DEFAULT 0, is_running INTEGER DEFAULT 1, owner TEXT DEFAULT 未分配, created_at TEXT DEFAULT (datetime(now, localtime)) ) ) # ③ 插入 5 条设备数据 devices_data [ (注塑机A1, 注塑, 65, 8, 1, 李工), (注塑机A2, 注塑, 82, 12, 1, 王工), (注塑机A3, 注塑, 91, 16, 1, 赵工), (冲压机B1, 冲压, 75, 9, 0, 李工), (冲压机B2, 冲压, 88, 6, 1, 陈工), ] cursor.executemany( INSERT INTO devices (name, type, temperature, vibration, is_running, owner) VALUES (?, ?, ?, ?, ?, ?) , devices_data) # ④ 提交 验证 关闭 conn.commit() # ⚠️ 不 commit数据不会真正写进文件 print(f✅ 建表成功插入了 {len(devices_data)} 条设备数据) cursor.execute(SELECT COUNT(*) FROM devices) print(f当前设备总数{cursor.fetchone()[0]}) conn.close()代码解读sqlite3是 Python 标准库中用于操作 SQLite 数据库的模块它让你无需安装任何额外软件或运行独立的数据库服务器就能在程序中使用完整的 SQL 数据库功能。sqlite3.connect(...)连接或创建数据库文件。如果fde_workshop.db不存在会自动新建一个空文件如果已存在就直接打开它。ursor游标执行 SQL 语句的遥控器。conn负责维持连接真正执行 SQL 要通过cursor.execute(...)。类比conn是电话线cursor是话筒——你对着话筒说话发 SQL对方才会有反应。DEFAULT插入数据时如果没写这个字段就用默认值。例如created_at会自动填当前时间。SQLite 是动态类型的INTEGER/TEXT/REAL更多是声明意图但养成写清楚类型的习惯很重要。SQLite 会自动处理类型转换数字、字符串、时间等。conn.commit()提交事务。cursor.fetchone()取出查询结果的第一行这里只有一个数所以用[0]取出。conn.close()关闭连接释放资源。步骤 3运行并观察在 VS Code 终端执行python 01_create_db.py预期输出✅ 建表成功插入了 5 条设备数据 当前设备总数5再看sql_practice文件夹——多了一个fde_workshop.db文件。这就是你的数据库全部数据都在里面。实际运行界面示例步骤 4拆解建表语句看懂每个字段CREATE TABLE devices ( id INTEGER PRIMARY KEY AUTOINCREMENT, -- 主键每条记录的唯一身份证号 name TEXT NOT NULL, -- NOT NULL这列必填不能空着 temperature REAL DEFAULT 0, -- REAL小数DEFAULT 0不填就默认 0 is_running INTEGER DEFAULT 1 -- SQLite 没有真正的布尔用 1/0 表示 )SQLite 常用数据类型给你理清楚类型含义对应 Python例子INTEGER整数int1、65、-3REAL小数浮点数float82.5、0.0TEXT文本字符串str注塑机A1BLOB二进制数据bytes图片、文件NULL空值None未知、没填几个必须懂的关键词主键PRIMARY KEY每行数据的唯一编号不能重复、不能空。就像身份证号靠它精准定位一条记录。AUTOINCREMENT自增。插入时不用给 id数据库自动 1、2、3……往下排。NOT NULL这一列必须有值插入时不给就报错。⚠️关键安全细节代码里的?是参数占位符。SQLite 用?MySQL 用%s。绝对不要用字符串拼接 SQL... VALUES ( name )那是SQL 注入漏洞的根源——黑客能靠一个引号删光你的表。这个坑周五用 SQLAlchemy 时会再加固。️ 三、SELECT 查询三板斧选字段、筛条件、排序分页数据进去了接下来是重头戏——把数据查出来。SQL 里 80% 的操作都是 SELECT。新建02_select.py SELECT 查询三板斧选字段、筛条件、排序分页 文件02_select.py import sqlite3 conn sqlite3.connect(fde_workshop.db) conn.row_factory sqlite3.Row # 让查询结果能像字典一样 row[name] 取值 cursor conn.cursor() def show(title, sql): 跑 SQL 并打印结果的小工具 print(f\n {title} ) cursor.execute(sql) for row in cursor.fetchall(): print( | .join(str(v) for v in tuple(row))) # ① 基础查询选哪些字段* 表示全部列生产中建议写明列名 show(所有设备只看4列, SELECT id, name, temperature, owner FROM devices) # ② WHERE条件筛选 show(温度超过 80 的设备, SELECT name, temperature FROM devices WHERE temperature 80) # ③ AND多条件同时满足 show(注塑机 且 在运行, SELECT name, temperature FROM devices WHERE type 注塑 AND is_running 1) # ④ IN在一个名单里 show(负责人是李工或王工, SELECT name, owner FROM devices WHERE owner IN (李工, 王工)) # ⑤ BETWEEN在某个区间含两端 show(温度在 70~90 之间, SELECT name, temperature FROM devices WHERE temperature BETWEEN 70 AND 90) # ⑥ LIKE模糊匹配% 代表任意多个字符 show(名字里含 A 的, SELECT name FROM devices WHERE name LIKE %A%) # ⑦ ORDER BY LIMIT排序后取前 N 个 show(温度从高到低前 3 名, SELECT name, temperature FROM devices ORDER BY temperature DESC LIMIT 3) conn.close()运行python 02_select.py对照下面的预期结果检查 温度超过 80 的设备 注塑机A2 | 82.0 注塑机A3 | 91.0 冲压机B2 | 88.0 温度从高到低前 3 名 注塑机A3 | 91.0 冲压机B2 | 88.0 注塑机A2 | 82.0SELECT 语句的完整长相SELECT 列名 -- 要哪些列* 全部 FROM 表名 -- 从哪张表 WHERE 条件 -- 筛哪些行 ORDER BY 列名 DESC -- 怎么排序DESC降序 / ASC升序默认ASC LIMIT 数量 -- 只返回前几行WHERE 条件操作符速查表这张表建议截图存手机写 SQL 时天天查操作符含义例子能匹配到什么等于type 注塑类型正好是注塑!或不等于is_running ! 1没在运行的 大小比较temperature 80温度超 80BETWEEN a AND b区间temperature BETWEEN 70 AND 9070 到 90含70 和 90IN (...)在列表中owner IN (李工,王工)负责人是李或王LIKE模糊匹配name LIKE %A%名字含 AIS NULL是空值owner IS NULL负责人没填IS NOT NULL不是空值phone IS NOT NULL有手机号的LIKE 通配符两个兄弟%匹配任意多个字符包括 0 个A% 以 A 开头%A 以 A 结尾%A% 含 A_匹配恰好一个字符A_匹配 A1 但不匹配A12⚠️注意 NULL 不能用判断WHERE phone NULL永远查不到东西必须写WHERE phone IS NULL。因为 NULL 表示未知未知不等于未知。️ 四、INSERT / UPDATE / DELETE增、改、删查询是读接下来是写三件套。新建03_crud.py INSERT / UPDATE / DELETE 增删改 文件03_crud.py import sqlite3 conn sqlite3.connect(fde_workshop.db) cursor conn.cursor() # ① INSERT新增一条 cursor.execute( INSERT INTO devices (name, type, temperature, vibration, is_running, owner) VALUES (注塑机A4, 注塑, 70, 7, 1, 赵工) ) conn.commit() print(f✅ 新增注塑机A4自动分配的 id {cursor.lastrowid}) # ② UPDATE修改⚠️ 一定、一定、一定加 WHERE cursor.execute( UPDATE devices SET temperature 95, is_running 1 WHERE name 注塑机A4 ) conn.commit() print(✅ 注塑机A4 温度更新为 95) # ③ DELETE删除⚠️ 更要加 WHERE cursor.execute(DELETE FROM devices WHERE name 注塑机A4) conn.commit() print(✅ 注塑机A4 已删除) # 验证数量应该还是 5 cursor.execute(SELECT COUNT(*) FROM devices) print(f当前设备总数{cursor.fetchone()[0]}) conn.close()三条语句的语法骨架记住这个模板-- 增往哪张表、哪些列、塞什么值 INSERT INTO 表名 (列1, 列2) VALUES (值1, 值2); -- 改改哪张表、改成啥、改哪些行 UPDATE 表名 SET 列1 新值 WHERE 条件; -- 删删哪张表的哪些行 DELETE FROM 表名 WHERE 条件; 头号生产事故忘加 WHERE 的 UPDATE / DELETE这是每个 DBA 和后端工程师的噩梦单独拎出来红字警告❌ DELETE FROM devices; -- 整张表瞬间清空连后悔药都没有 ❌ UPDATE devices SET ownerX; -- 全表所有设备的负责人都变成 X ✅ DELETE FROM devices WHERE id 6; -- 只删 id6 这一条 ✅ UPDATE devices SET temperature95 WHERE name 注塑机A4; -- 只改 A4FDE 保命操作规范在客户的生产数据库执行 UPDATE / DELETE 之前先用一模一样的 WHERE 写一条 SELECT 跑一遍-- 第一步先查确认这些行就是你要动的 SELECT * FROM devices WHERE name 注塑机A4; -- 第二步确认无误再把 SELECT * 换成 DELETE / UPDATE DELETE FROM devices WHERE name 注塑机A4;多花 10 秒钟能保住你一份工作。为什么 INSERT/UPDATE/DELETE 后要 commit你的代码 数据库文件 ─────── ────────── cursor.execute(INSERT) → 改动只在草稿区事务 此时别人查不到、断电就没 conn.commit() → ✅ 正式落盘改动生效 conn.close() 没 commit → ❌ 草稿丢弃白干这叫**事务Transaction**机制。好处是你连着做了 5 个操作中途出错可以整体回滚不会留下半截脏数据。周五会细讲。sqlite3模块中的关键对象与操作总结Connection对象代表与数据库文件的连接。它管理事务并提供commit()和rollback()方法。一个实用的技巧是把它当作上下文管理器with语句使用代码块正常结束时自动提交发生异常时自动回滚能有效避免忘记提交或提交错误数据。Cursor对象你代码中注释的“遥控器”比喻很贴切。它负责执行 SQL 并获取结果。除了execute和executemany还有executescript()一次性执行由分号分隔的多条 SQL 语句适合初始化脚本。fetchall()/fetchone()/fetchmany()分别用于获取所有、一行或指定数量的查询结果。lastrowid执行INSERT后可以获取刚插入行的自增主键id这在需要引用新记录时很有用。Row对象默认情况下查询结果返回的是元组。但你可以设置conn.row_factory sqlite3.Row让结果行支持通过列名访问例如row[temperature]代码可读性会更好。️ 五、装个可视化工具 DBeaver用图形界面看数据库老在 Python 里拼 SQL 字符串不够直观。推荐一个免费神器DBeaver几乎支持所有数据库。安装步骤打开 Download | DBeaver Community 下载Community Edition免费开源版一路下一步安装安装后进入配置界面Choose which theme you want to use:(选择您想要使用的主题)Dark(深色) - 未选中Light(浅色) -已选中(蓝色圆点)Choose preferred database structure view in navigator:(在导航器中选择首选的数据库结构视图)Simplified(简化) - 未选中Full(完整) -已选中(蓝色圆点)Custom...(自定义...) - 未选中旁边有一个可点击的Customize...链接。下方还有一个蓝色的文字链接Learn more about the differences(了解更多关于差异的信息)。说明文字DBeaver includes optional features for different tasks. Enable the ones you want to use: (DBeaver 包含针对不同任务的可选功能。请勾选您想要使用的功能)选项1AI integration(AI 集成) -已勾选(带有蓝色复选框)选项2Database dashboards(数据库仪表板) -已勾选(带有蓝色复选框)隐私选项设置Share anonymous usage statistics(分享匿名使用统计数据) -已选中(蓝色圆点)。这是默认选项。Do not share anonymous usage statistics(不分享匿名使用统计数据) - 未选中。关于收集内容的说明Shared statistics include下方列出了如果选择分享将会收集的具体信息类别- Your operating system and locale(您的操作系统和区域设置)- Features and interface actions you use(您使用的功能和界面操作)- Types of databases you work with(您使用的数据库类型)具体的设置选项创建示例数据库说明文字DBeaver comes with a handy sample database powered by SQLite that you can use to explore the features and capabilities of the application.(DBeaver 附带了一个由 SQLite 驱动的便捷示例数据库您可以用来探索应用程序的功能和特性。)选项Create sample database(创建示例数据库) -未勾选。如果您是第一次使用建议勾选此项以便有一个现成的环境来练习 SQL 查询。每日提示说明文字You can enable tips that will appear daily to help you get familiar with the application and learn some useful features.(您可以启用每日提示帮助您熟悉应用程序并了解一些有用的功能。)选项Turn on Tip of the day(开启“每日提示”) -已勾选。配置完成进入使用界面点左上角新建连接插头图标→ 选择SQLite→ 下一步Path 那栏浏览选中你的fde_workshop.db文件 → 点完成左侧展开连接 → 展开 Tables → 双击devices表 → 切到数据标签页你会看到数据整整齐齐躺在表格里跟 Excel 几乎一样。在 DBeaver 里直接写 SQL右键devices表 → SQL 编辑器 → 新建 SQL 脚本输入SELECT name, temperature, owner FROM devices WHERE temperature 80 ORDER BY temperature DESC;按Ctrl Enter或点橙色执行按钮→ 下方立刻出结果 DBeaver 的杀手锏自动补全 语法高亮。你敲SEL它提示SELECT敲表名提示列名。学习 SQL 阶段强烈建议在 DBeaver 里练查询比在 Python 里拼字符串舒服 10 倍。熟练后再回到代码里。参考VS也可以操作SQLite双击数据库文件自动会打开SQLite视图可以通过右键菜单进行一些操作如图 本课小结知识点一句话记住数据库超级 Excel数据持久保存重启不丢SQLite一个 .db 文件 一个数据库Python 自带数据类型INTEGER 整数 / REAL 小数 / TEXT 文本 / NULL 空主键每行的唯一身份证PRIMARY KEY AUTOINCREMENT自增SELECT选字段配 WHERE 筛选、ORDER BY 排序、LIMIT 限量WHEREINBETWEENLIKEIS NULLINSERTINSERT INTO 表(列) VALUES(值)UPDATEUPDATE 表 SET 列值 WHERE 条件必须加 WHEREDELETEDELETE FROM 表 WHERE 条件更必须加 WHEREcommit写操作后必须 commit否则改动不落盘占位符SQLite 用?防 SQL 注入别拼字符串DBeaver免费的数据库图形化工具练 SQL 神器 核心认知SQL 操作分两大类——读SELECT和写INSERT/UPDATE/DELETE。读随便试查错了不会坏数据写要敬畏尤其 UPDATE/DELETE先 SELECT 确认再动手。 课后练习练习 1在 DBeaver 里写 10 道查询约 40 分钟用 SQL 编辑器完成每道题先自己想再敲查所有运行中的设备is_running 1查温度最高的 3 台设备查负责人不是李工的设备提示!查振动值在 8~12 之间的设备查所有设备名和温度按温度从低到高排ASC新增一台设备焊接机C1类型填焊接其他值自己定把注塑机A3的温度改成 85删除你刚新增的焊接机C1先 SELECT 确认再 DELETE统计设备总数提示SELECT COUNT(*) FROM devices查所有停机的设备is_running 0看看是哪台练习 2写个可复用的查询脚本约 20 分钟新建query_devices.py接收一个温度阈值参数打印超过该温度的设备python query_devices.py 80 # 输出温度 80 的所有设备提示用sys.argv[1]拿参数记得转成floatSQL 里用?占位符传参。 下节预告今天我们一直在一张表里折腾。但真实业务里设备信息、工程师档案、工单记录是分开存在好几张表里的——为什么要拆拆开以后怎么一起查明天学两个 FDE 数据查询的核心技能**JOIN把多张表拼起来查**和GROUP BY分组统计。比如每个车间有几台设备、平均温度多少明天一行 SQL 搞定。今天的单表是地基明天才是数据库真正的威力所在养好精神明天见附录前置课程列表阶段一【FDE系列】阶段1Day 1AI 层级关系 — 四个嵌套的圈-CSDN博客【FDE系列】阶段1Day 2AI 三阶段发展史 — 会认 → 会判断 → 会创造-CSDN博客【FDE系列】阶段1Day 3符号 AI vs 机器学习 — 两条路线的本质区别-CSDN博客【FDE系列】阶段1Day 4Transformer 的历史意义 — 2017 年的分水岭-CSDN博客【FDE系列】阶段1Day 5本周复习与自测 — 检验你的 AI 认知地基-CSDN博客【FDE系列】阶段1Day 6Transformer 架构 — 一张图纸盖出千千万万栋楼-CSDN博客【FDE系列】阶段1Day 7LLM 本质 — 文字接龙机器-CSDN博客【FDE系列】阶段1Day 8Token — 模型眼中的最小单位-CSDN博客【FDE系列】阶段1Day 9AI 幻觉 — 为什么会一本正经地胡说八道-CSDN博客【FDE系列】阶段1Day 10上下文窗口 — 模型的记忆力上限 本周复习-CSDN博客【FDE系列】阶段1Day 11Prompt — 给模型立规矩-CSDN博客【FDE系列】阶段1Day 12Memory — 让模型记住上下文【FDE系列】阶段1Day 13RAG — 给模型配图书管理员-CSDN博客【FDE系列】阶段1Day 14Tool Use — 让模型动手操作-CSDN博客【FDE系列】阶段1Day 15MCP — 统一的工具接口标准 第三周复习-CSDN博客【FDE系列】阶段1Day 16什么是 FDE — 把 AI 变成客户结果的人-CSDN博客【FDE系列】阶段1Day 17FDE vs 传统实施 — 三大本质区别-CSDN博客【FDE系列】阶段1Day 18FDE 三重身份 C6 胜任力模型-CSDN博客【FDE系列】阶段1Day 19七阶段行动路径 行业经验的价值-CSDN博客【FDE系列】阶段1Day 20阶段总结与产出物 — 第一阶段收官-CSDN博客阶段二【FDE系列】阶段2Day 21Python 环境搭建 — 写出你的第一行代码-CSDN博客【FDE系列】阶段2Day 22变量、数据类型、条件判断 — Python 的“记忆“和“判断“-CSDN博客【FDE系列】阶段2Day 23循环与函数 — 让代码跑 100 遍、把逻辑打包复用-CSDN博客【FDE系列】阶段2Day 24数据结构 — 列表、字典、集合、元组-CSDN博客【FDE系列】阶段2Day 25文件读写与 JSON — 让程序连通外部数据第一周收官-CSDN博客【FDE系列】阶段2Day 26模块化编程 — 把代码拆成“抽屉柜“-CSDN博客【FDE系列】阶段2Day 27异常处理与日志 — 让程序“摔不烂、查得到“-CSDN博客【FDE系列】阶段2Day 28FastAPI 入门 — 把你的函数变成 API 服务-CSDN博客【FDE系列】阶段2Day 29FastAPI 进阶 — Pydantic 模型与完整 CRUD 实战-CSDN博客【FDE系列】阶段2Day 30生产代码规范 — 测试、类型注解、配置管理第二周收官-CSDN博客