schema-migration
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseSchema Migration
Schema Migration
Khi nào trigger
触发时机
project-orchestratoropenspec/changes/<change-name>/specs/<domain>/spec.mdopenspec/specs/<domain>/spec.mdflutter-coding当检测到delta spec()中的数据模型与已归档的模型()或代码中的实际模型存在差异(新增字段、重名字段、更改类型、删除字段)时触发。这是修改模型前的必做步骤,即使是微小的变更也不能跳过。
project-orchestratoropenspec/changes/<change-name>/specs/<domain>/spec.mdopenspec/specs/<domain>/spec.mdflutter-codingQuy trình
流程
-
Diff model: so sánh field cũ (trongđã archive, đối chiếu code thật qua codebase-memory nếu có) với field mới (delta spec trong
openspec/specs/<domain>/spec.md). Liệt kê rõ: field nào thêm, field nào xóa, field nào đổi kiểu.changes/<change-name>/specs/ -
Xác định loại lưu trữ đang dùng: local DB (Hive/SQFLite/Drift) hay chỉ gọi API/Firebase không lưu local.
- Nếu chỉ dùng API/Firebase không cache local → thường chỉ cần cập nhật model + parse JSON, rủi ro thấp hơn, vẫn nên test qua MCP.
- Nếu có local DB → bắt buộc viết migration script (không sửa model rồi để app tự crash lần chạy sau).
-
Sinh migration script tương ứng:
- SQFLite/Drift: viết hoặc bump
ALTER TABLE+version.onUpgrade - Hive: tạo version mới, viết logic đọc dữ liệu cũ và map sang field mới (field mới thêm cần giá trị mặc định).
TypeAdapter
- SQFLite/Drift: viết
-
Chạy thử migration qua MCP trên simulator/dev trước khi cho phépsửa code chính thức dùng model mới. Nếu app dữ liệu mẫu (seed data) đang có sẵn, test load lại dữ liệu cũ qua migration để chắc không mất/lỗi data.
flutter-coding -
Nếu migration fail: rollback (dùng git checkpoint gần nhất, xem), sửa lại script, không cố sửa đè lên code đã lỗi.
git-checkpoint/SKILL.md -
Sau khi migration pass → mới chuyển sangđể cập nhật phần code dùng model mới (UI, provider...).
flutter-coding/SKILL.md
-
对比模型差异:将旧字段(来自已归档的,若有codebase-memory则对照实际代码)与新字段(来自
openspec/specs/<domain>/spec.md中的delta spec)进行对比,明确列出:新增哪些字段、删除哪些字段、哪些字段更改了类型。changes/<change-name>/specs/ -
确定当前使用的存储类型:是本地数据库(Hive/SQFLite/Drift)还是仅调用API/Firebase不进行本地存储。
- 若仅使用API/Firebase且不进行本地缓存 → 通常只需更新模型+解析JSON,风险较低,但仍需通过MCP测试。
- 若使用本地数据库 → 必须编写迁移脚本(不能直接修改模型导致应用下次启动崩溃)。
-
生成对应的迁移脚本:
- SQFLite/Drift:编写语句,或升级版本并实现
ALTER TABLE逻辑。onUpgrade - Hive:创建新版本的,编写读取旧数据并映射到新字段的逻辑(新增字段需设置默认值)。
TypeAdapter
- SQFLite/Drift:编写
-
在模拟器/开发环境通过MCP测试迁移,之后才能允许正式修改代码使用新模型。若已有测试种子数据,需测试通过迁移加载旧数据,确保数据不会丢失或出错。
flutter-coding -
若迁移失败:回滚(使用最近的git checkpoint,参考),修改脚本,不要强行覆盖已有错误的代码。
git-checkpoint/SKILL.md -
迁移通过后 → 再进入更新使用新模型的代码部分(UI、provider等)。
flutter-coding/SKILL.md
Ví dụ cụ thể
具体示例
Ngày 7, delta spec trongthêm fieldchanges/add-product-color/specs/product/spec.md(String) vào modelcolor(vốn chỉ cóProduct,idtrongnameđã archive).openspec/specs/product/spec.md
- Diff: thêm field , kiểu String, cần giá trị mặc định (ví dụ
colorhoặc""cho phép).null - Nếu dùng Hive: bump TypeAdapter, field mới đánh dấu optional/default để đọc được record cũ không có field này.
Product - Test: load lại 1 record cũ (không có ) qua adapter mới, xác nhận không crash,
colortrả về giá trị mặc định.color - Pass → mới cho sinh UI hiển thị
flutter-codingtrong màn hình Product.color
7日,中的delta spec为changes/add-product-color/specs/product/spec.md模型新增了Product字段(String类型),而已归档的color中的openspec/specs/product/spec.md模型仅包含Product、id字段。name
- 差异:新增字段,类型为String,需设置默认值(例如
color或允许为"")。null - 若使用Hive:升级的TypeAdapter,将新字段标记为可选/设置默认值,确保能读取无该字段的旧记录。
Product - 测试:通过新适配器加载一条无字段的旧记录,确认不会崩溃,
color返回默认值。color - 测试通过后 → 才能让生成在产品页面显示
flutter-coding的UI。color
Không làm gì nếu đây là project mới hoàn toàn
全新项目无需操作
Nếu chưa có data thật (project mới init, model đầu tiên) thì không cần migration script, chỉ cần định nghĩa model đúng ngay từ đầu và bỏ qua bước này.
若项目刚初始化,还没有实际数据(首次定义模型),则无需编写迁移脚本,只需从一开始就正确定义模型,跳过此步骤。