迁移计划应先回答同一条记录会变成什么。总数相同却把标题放错行,仍然是错误迁移。
源数据和目标约束
把以下教学数据保存为 old.json。目标要求 id 保持、slug 唯一、state 只能是 draft 或 published。练习仅输出文件,不连接数据库。
json
[
{"old_id":11,"path":"/start/","heading":"开始使用","live":true},
{"old_id":12,"path":"/fees/","heading":"收费说明","live":false},
{"old_id":13,"path":"/start/","heading":"旧版开始","live":false}
]
写出转换和冲突决定
| 目标字段 | 来源与规则 | 例子 |
|---|---|---|
| id | old_id,保持整数且唯一 | 11 → 11 |
| slug | path 去两端斜线;转换后再查重 | /fees/ → fees |
| title | heading 原样保留 | 收费说明 → 收费说明 |
| state | live=true为published,false为draft;其他值报错 | false → draft |
11和13都会得到 start。首轮计划必须列冲突并停止生成可导入成品,不可自动丢弃13或加随机后缀。教学中的后续明确决定是:“保留两条,13改为start-legacy并保持draft;旧URL是否重定向另作决定。”这项决定写入 decisions.md 才进入试迁。
同一组记录的预期试迁结果
json
[
{"id":11,"slug":"start","title":"开始使用","state":"published"},
{"id":12,"slug":"fees","title":"收费说明","state":"draft"},
{"id":13,"slug":"start-legacy","title":"旧版开始","state":"draft"}
]
可给 Codex:“读取old.json与decisions.md,只在output/new.json写候选结果;输出逐ID对照表,检查3个ID各出现一次、slug唯一、标题逐字相等、published为1条、draft为2条。未定义的类型或冲突必须报错。”
把第13条 live 改为字符串“false”再试一次,预期应报类型问题,不应按真值转换为published。这个反例可以发现只写布尔判断、没有验证输入类型的转换。
文件试迁之后还有什么
此处没有真实数据库、并发写入或外键,因此不能宣布生产迁移成功。正式计划还需固定源快照时间、处理增量写入,记录目标约束和实际备份恢复演练。若目标写入失败,不依据“已读3条”判断成功,必须按目标实际持久化的ID和内容对账。
下一步
继续阅读与你当前问题相关的教程:


