🐦 第7章 扣子数据库实战
📄 一句话概括

三个动作:加字段、改字段名、删表。 风险从低到高。 加字段最安全,老数据只是空着;改字段名最阴,错不在改,在引用的地方;删表最干脆,没有撤销。 删表之前要备份两样东西:数据,和结构。 光有数据恢复不了表。

📝 本章和前面几章的关系

上一节讲数据怎么进出,这一节讲表结构怎么改。 这一节有三个小节:管理数据表(加字段)、编辑数据表(改字段)、删除数据表。 第 5.6 节讲过知识库的「更新滞后」——数据库这边有个近亲:改了字段名,引用它的工作流还在用旧名, 静默失败。

一、加字段:最安全的那个

加字段是一句话的事。演示里给访客表加了个 dept。 加完之后字段列表多了一个,但老记录的新字段是空的——张伟和王芳那两行的 dept 都是 None。 这不是 bug,是必然:那两行写进去的时候,这个字段还不存在。

所以要补数据。补的办法是跑一遍更新,按 gid 一行一行填。加字段的工时不在加,在补。

二、改字段名:错不在改

改字段名本身也是一句话。演示里把 purpose 改成 reason,改完字段列表就变了。 问题是之后:用旧名字查会报 no such column: purpose。 而在真实项目里,引用旧名字的地方不止一处:工作流节点的入参、提示词里的字段名、下游代码节点、 看板配置、导出报表。

所以改字段名之前要搜一遍:这个字段名出现在哪几个地方?全部改完再改表。 顺序反了就是事故:先改表,那些引用全部静默失败——链照跑,日志照绿,值是空的。

三、改字段类型:只能重建

演示里试了直接改类型,sqlite 报语法错——它不支持。 标准做法三步:建新表 → 拷数据 → 删旧表改名。 演示里跑完了,两行数据还在。 平台上看起来简单些(点一下选新类型),但底下一样是重建。历史数据要么转换要么丢。

文本改整数,里面存着「abc」,转换时就报错或者变成 0。改之前先查一遍:这一列有没有转不过去的值。

四、删表:最干脆的那个

演示里删表之后再查,报「表不存在」。删之前两行,删之后连结构都没了。 平台的「删除数据表」按钮不给撤销。 点之前确认三件事:这张表被哪个工作流引用、有没有备份、能不能重建。 第一件最容易被忽略。表被删了,引用它的工作流不会报错,只会在跑到那一步时失败。 所以删表之前先在工作流里搜表名。

第三件也值得想:能不能重建,取决于你是否记得字段结构。记不得就恢复不了。

五、备份要备两样

很多人备份只导数据。没有建表语句,光有数据也恢复不了表。 所以备份分两份:一份数据(CSV 或 JSON),一份结构(字段名、类型、默认值、必填)。 平台上的导出通常把字段名一起导出来,这算顺手解决了。 但字段类型和必填标记往往不带——那部分要自己记一笔。

一个便宜的习惯:建表那天把字段结构截图存到知识库里。两分钟的事,删表那天能救命。

六、三个动作的风险排序

动作 风险 为什么
加字段 低 老数据只是空着,不影响已有逻辑
改字段名 中偏高 错不在改,在引用它的那些地方
改类型 高 要重建,历史数据可能转不过去
删表 最高 不给撤销,引用它的工作流全部失效

排序里最反直觉的是「改字段名」比「改类型」低但比「加字段」高很多。 因为改类型你会有心理准备,改字段名你会觉得「就改个名」。 最危险的操作往往是看起来最无害的那个。

七、动手 Demo:改结构、改数据、删表

一张两行的访客表,依次做四件事:加字段、改字段名、改类型、删表。 每一步之后都看一眼字段列表,看数据还在不在。

ALTER TABLE guest ADD COLUMN dept TEXT          -- 加字段:老数据空着

ALTER TABLE guest RENAME COLUMN purpose TO reason -- 改字段名
SELECT purpose FROM guest                        -- 旧名字报错

ALTER TABLE guest ALTER COLUMN phone INTEGER     -- sqlite 不支持
-- 只能重建:建新表 → 拷数据 → 删旧表 → 改名

实跑输出:

--------------------------------------------------------------------
改结构、改数据、删表
--------------------------------------------------------------------


  ① 加一个字段
  --------------------------------------------------------------------
  加之前:gid、name、phone、purpose
  加之后:gid、name、phone、purpose、dept
  老记录的新字段:张伟=None,王芳=None
  字段加了,历史数据不会自动补。 那两行的 dept 是空的。

  ② 改字段名
  --------------------------------------------------------------------
  改之后:gid、name、phone、reason、dept
  用旧名字查:no such column: purpose
  改字段名会同时打断所有引用旧名的地方:工作流节点、提示词里的字段名、下游代码、看板。
  改之前先搜一遍旧名出现在哪几个文件里。

  ③ 改字段类型
  --------------------------------------------------------------------
  sqlite 不支持直接改类型:near "INTEGER": syntax error
  标准做法是三步:建新表 → 拷数据 → 删旧表改名。
  平台上更省事,但同样要重建,历史数据要么转换要么丢。
  重建完:gid、name、phone、reason、dept,2 行

  ④ 删表
  --------------------------------------------------------------------
  删表后再查:no such table: guest
  删之前有 2 行。删之后:表不在了,数据和结构一起没了。
  平台的「删除数据表」按钮不给撤销。
  点之前确认三件事:这张表被哪个工作流引用、有没有备份、能不能重建。

  ⑤ 删表之前该备份什么
  --------------------------------------------------------------------
  不只是数据,还有结构。没有建表语句,光有数据也恢复不了。
  所以备份分两份:一份数据(导成 CSV 或 JSON),一份结构(字段名、类型、默认值)。
  平台上的做法通常是导出全部记录,把字段名一起导出。
  只导 data 不导 schema,重建时要靠记忆猜字段类型。
  ! 这一节三个操作,风险从低到高:加字段 < 改字段名 < 删表。
  加字段最安全(老数据只是空着),改字段名最阴(错不在改,在引用的地方),删表最干脆(没有撤销)。

①第一段加字段:字段列表多了一个 dept,但张伟和王芳那两行是 None。 加字段的工时不在加,在补数据。 ②第二段改字段名:改完用旧名字查直接报错。 真实项目里引用旧名的地方不止一处——工作流、提示词、代码、看板。 ③第三段改类型:sqlite 直接不支持,要重建。 演示里用建新表 → 拷数据 → 删旧表 → 改名四步走完,两行数据还在。 ④第四段删表:删之前两行,删之后连结构都没了,再查报「表不存在」。 ⑤最后那张风险排序表里,最该记的是「改字段名」——它看起来最无害,实际比加字段危险得多。

30 秒实验

  1. 搜一遍你的工作流里引用了哪些字段名。改名字之前先把这张单子列出来。
  2. 给每张表把字段结构(名字、类型、必填)记一份,存到知识库里。
  3. 找一个你打算删的表,先查它被哪个工作流引用。查完你可能就不删了。

常见误区

  1. 「改个字段名而已。」引用旧名的地方全部静默失败:链照跑、日志照绿、值是空的。
  2. 「删表前导了数据就够了。」没有建表语句,光有数据恢复不了表。结构也要备。
  3. 「加字段不影响老数据。」老数据的新字段是空的,那批记录要补。
自测三问(点开对答案) 1. 为什么改字段名比改类型更阴? —— 改类型你有心理准备,改名字你会觉得「就改个名」,忘了引用它的那些地方。 2. 改字段类型为什么要重建表? —— 多数引擎不支持直接改。建新表、拷数据、删旧表改名,历史数据可能转不过去。 3. 备份要备哪两样? —— 数据和结构。没有建表语句,光有数据恢复不了表。

会管了,下一节讲它和传统数据库到底差在哪——一条一条量,最要紧的是事务。

相关笔记