Add SpacetimeDB schema guard
This commit is contained in:
@@ -58,6 +58,14 @@ host 会比较新模块声明的 schema 和旧数据库 schema,然后尝试自
|
||||
4. 等数据迁移完成、旧客户端完成升级、旧表数据清空后,再移除旧表。
|
||||
5. 开发环境可以使用 `--delete-data` 重建数据库,生产环境不要用它作为数据迁移方案。
|
||||
|
||||
## 字段级硬性约束
|
||||
|
||||
- 对已有 SpacetimeDB 表新增字段时,必须把新字段追加在 Rust 表结构体的最后,不能插入已有字段中间。
|
||||
- 新增字段必须设置明确默认值,例如 Rust `#[default(...)]`;复杂集合默认值如果无法作为编译期常量表达,应优先使用 `Option<T>` 加 `#[default(None::<T>)]`,并在业务层归一化。
|
||||
- 修改已有字段名属于高风险 schema 变更。编码前必须先询问用户,确认旧字段名、新字段名、数据保留方式、客户端兼容窗口和发布顺序,并让用户准备或确认迁移计划。
|
||||
- 字段改名或任何 row shape 迁移都必须同步更新 `server-rs/crates/spacetime-module/src/migration.rs`、`SPACETIMEDB_TABLE_CATALOG.md` 和生成绑定;不要只改表结构体。
|
||||
- 修改 SpacetimeDB schema 后必须运行 `npm run check:spacetime-schema`。该检查会对比当前工作区与基准分支的 Rust table 字段,自动拦截新增字段缺 default、字段插入中间、字段删除/改名/重排/改类型,以及漏改 `migration.rs`、表目录或生成绑定。
|
||||
|
||||
## 通常安全的变更
|
||||
|
||||
这些变更一般可以自动迁移,并且通常不会破坏现有客户端:
|
||||
@@ -223,6 +231,8 @@ fn migrate_character_batch(ctx: &ReducerContext, limit: u32) {
|
||||
|
||||
- 是否删除、改名、重排或修改了已有列。
|
||||
- 新增列是否位于表定义末尾,并且是否有 default value。
|
||||
- 如需改字段名,是否已先询问用户并确认迁移计划,且已同步更新 `migration.rs`。
|
||||
- 是否已运行 `npm run check:spacetime-schema` 并通过。
|
||||
- 是否给已有表新增了 unique 或 primary key 约束。
|
||||
- 是否删除了非空表。
|
||||
- 是否修改了 event table、schedule table、RLS 或 view。
|
||||
|
||||
Reference in New Issue
Block a user