[SEN] 修复旧设备 capabilities 迁移到 JSONB(#92) #93

Merged
ila merged 5 commits from fix/92-sense-capabilities-jsonb into dev 2026-08-15 15:28:04 +08:00
Owner

关联工单:#92

根因与修复

旧数据库的 sense_devices.capabilities 是 text NOT NULL DEFAULT '',旧记录保存单值能力;当前模型要求 JSONB,GORM AutoMigrate 因默认值和旧数据无法直接转换而报 SQLSTATE 42804。

修复在原设备迁移事务开头增加 PostgreSQL 兼容步骤:

  • 仅处理旧 text/varchar 列,已是 json/jsonb 或表不存在时跳过。
  • ACCESS EXCLUSIVE 锁表后先验证全部旧值,再改变任何数据。
  • 空值转 [];六种受支持单值转 JSON 数组;合法字符串数组规范化。
  • 未知/非法内容拒绝迁移并整体回滚,不输出具体业务值。
  • 删除旧默认值、参数化更新、显式转 jsonb、设置 '[]'::jsonb,再继续原 AutoMigrate 和版本登记。

验证

  • 纯函数表驱动测试通过。
  • 独立 PostgreSQL 17 数据库覆盖旧单值、空值、合法数组、未知值回滚、无表、重复调用、完整设备迁移和 sys_migration 登记,全部通过;测试数据库已删除。
  • go test ./...、go vet ./...、go build ./... 通过。
  • 定向 race 和 git diff --check 通过。
  • Troubleshooting Wiki 与 #92 归档定向同步检查通过。
  • Harness strict 仅受既存 #66/#67 归档格式问题影响。

安全与交付

当前用户的 sense 数据库未执行写迁移,Sense/dist 也未替换。合入后必须先备份数据库,再让 #70 交付分支吸收本修复并重新打包,最后执行迁移启动验收。

关联工单:#92 ## 根因与修复 旧数据库的 `sense_devices.capabilities` 是 `text NOT NULL DEFAULT ''`,旧记录保存单值能力;当前模型要求 JSONB,GORM AutoMigrate 因默认值和旧数据无法直接转换而报 SQLSTATE 42804。 修复在原设备迁移事务开头增加 PostgreSQL 兼容步骤: - 仅处理旧 text/varchar 列,已是 json/jsonb 或表不存在时跳过。 - ACCESS EXCLUSIVE 锁表后先验证全部旧值,再改变任何数据。 - 空值转 `[]`;六种受支持单值转 JSON 数组;合法字符串数组规范化。 - 未知/非法内容拒绝迁移并整体回滚,不输出具体业务值。 - 删除旧默认值、参数化更新、显式转 jsonb、设置 `'[]'::jsonb`,再继续原 AutoMigrate 和版本登记。 ## 验证 - 纯函数表驱动测试通过。 - 独立 PostgreSQL 17 数据库覆盖旧单值、空值、合法数组、未知值回滚、无表、重复调用、完整设备迁移和 sys_migration 登记,全部通过;测试数据库已删除。 - `go test ./...`、`go vet ./...`、`go build ./...` 通过。 - 定向 race 和 `git diff --check` 通过。 - Troubleshooting Wiki 与 #92 归档定向同步检查通过。 - Harness strict 仅受既存 #66/#67 归档格式问题影响。 ## 安全与交付 当前用户的 `sense` 数据库未执行写迁移,`Sense/dist` 也未替换。合入后必须先备份数据库,再让 #70 交付分支吸收本修复并重新打包,最后执行迁移启动验收。
ila added 5 commits 2026-08-15 15:20:57 +08:00
ila merged commit eaa6ae0815 into dev 2026-08-15 15:28:04 +08:00
Sign in to join this conversation.