[SEN] 兼容旧媒体路由 path 唯一约束迁移 #95
Closed
opened 2026-08-15 15:37:59 +08:00 by ila
·
4 comments
No Branch/Tag Specified
dev
feat/183-bell-contact-schedule
docs/171-coordination-e2e-wiki
feature/155-coordination-e2e
docs/168-sync-coordination-wiki
feature/154-coordination-deployment
docs/152-153-connectors
feature/153-event-evidence-connector
feature/152-brain-control
docs/151-machine-identity-acceptance
task/151-machine-identity
docs/150-contract-acceptance
docs/148-149-contract-acceptance
feature/149-runtime-status-contract
feature/150-event-evidence-contract
feature/148-source-config-contract
docs/8-mvp-acceptance
feature/145-sense-e2e-isolation-cleanup
feature/134-bell-independent-e2e
feature/142-bell-ui-shell-startup
feature/140-bell-minimal-admin-menu
feature/138-bell-production-captcha
feature/133-bell-alert-lifecycle
feature/132-bell-rule-alert
feature/131-bell-event-receipt
feature/16-brain-local-events
feature/15-brain-rules
feature/14-brain-vision
feature/13-brain-decode
feature/11-brain-input
main
feat/sense-79-ops-alerts
feat/sense-78-outbox
feat/77-sense-media-shards
feat/76-sense-edge-node-status
feat/75-sense-quota-capacity
feature/74-sense-operations
feature/73-sense-local-events
feature/72-sense-bulk-provisioning
feature/113-record-parallel-acceptance
feature/113-sync-parallel-implementation-docs
feature/71-sense-e2e-regression
feature/62-bell-goadmin-skeleton
feature/10-brain-python-cuda-skeleton
feature/108-sync-devharness
feature/90-sense-root-launcher
feature/106-supervisor-sense
fix/101-sense-layout-shell
feature/104-sense-login-30-days
docs/99-acceptance
feature/99-sense-app-config
feature/70-sense-windows-delivery
fix/95-sense-media-path-constraint
feature/97-sense-password-login
docs/92-acceptance
fix/92-sense-capabilities-jsonb
docs/69-acceptance
feature/69-sense-area
feature/68-sense-liveview
feature/67-sense-mediamtx-reconcile
feature/66-sense-onvif-admission
feature/65-sense-device-credential
feature/64-sense-auth-rbac-audit
feature/61-sense-goadmin-source-baseline
docs/acceptance-batch-20260814
coordination/58-finalize-branch-governance
explore
agent/codex/56-sense-device-edit-payload
agent/codex/54-sense-liveview-on-demand
agent/codex/51-sense-auto-liveview
agent/codex/50-sense-split-camera-credentials
agent/codex/48-sense-onvif-digest
agent/codex/46-sense-env-loader
agent/codex/44-sense-empty-navigation
agent/codex/42-sense-password-length-only
agent/codex/40-sense-password-min-6
agent/codex/37-sense-windows-package
agent/codex/36-bell-docs
agent/codex/9-bell-mvp
agent/codex/21-sense-mvp
agent/codex/28-current-prototypes
agent/codex/5-goadmin-baseline
agent/codex/3-go-admin-ui-reuse
agent/codex/1-collaboration-rules
No results found.
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: ila/yovision#95
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
状态
已完成
基本信息
dev)原始需求与追溯
sense_devices.capabilities成功转换为jsonb NOT NULL DEFAULT '[]';随后媒体迁移报 SQLSTATE 42704:约束uni_sense_media_routes_path不存在。sense_media_routes.path由 PostgreSQL 唯一约束sense_media_routes_path_key保证唯一;新 GORM 模型使用uniqueIndex,AutoMigrate 把列识别为旧唯一约束,却按推导名称删除uni_sense_media_routes_path,名称不一致导致失败。媒体迁移版本2026081419000未登记,失败事务未留下新增列或菜单半成品。目标
兼容旧库中由 PostgreSQL 自动命名的
path唯一约束,在不丢失媒体路由和唯一性保护的前提下,让媒体迁移完成并可重复执行。做什么
2026081419000媒体迁移的 AutoMigrate 前增加 PostgreSQL 专用旧唯一约束兼容步骤。sense_media_routes,识别只覆盖path的旧唯一约束。不做什么
不删除媒体路由;不清空数据库;不修改设备凭据或客户配置;不修改 Brain、Bell、共享契约或根级部署;不把本缺陷混入已验收的 #92。
写路径
Sense/server/cmd/migrate/migration/version/2026081419000_media.goSense/server/cmd/migrate/migration/version/2026081419000_media_test.goTroubleshootingdocs/06-troubleshooting.mddocs/task/<本工单归档>.mdwiki-docs.json禁止写入:
Brain/**、Bell/**、contracts/**、Sense/dist/**、当前用户数据库数据(正式验证阶段仅在已确认并有可恢复备份后执行)。建议方案
对 PostgreSQL 旧表执行可审计的兼容步骤:锁表;确认现有 path 唯一约束;创建新模型命名的唯一索引以持续保护唯一性;使用 pg_catalog 返回的实际约束名安全移除旧约束;再运行现有 AutoMigrate。整个迁移保持单事务,任一步失败全部回滚。
风险与回退
pg_restore --list。验收标准
path始终具有唯一性保护验证方式
go test ./cmd/migrate/migration/version、go test ./...、go vet ./...、go build ./...。文档影响
更新 PostgreSQL 媒体路由旧唯一约束兼容、备份要求、失败处理和重试方式。
实施中变化记录
source_ready boolean NOT NULL且旧行为空而报 SQLSTATE 23502。为满足已确认的“保留既有路由并完成迁移”,兼容步骤扩展为在同一 ACCESS EXCLUSIVE 锁和事务内添加/回填新运行态列:source_ready=false、failure_count=0、last_error_code='',再设置 NOT NULL 并继续 AutoMigrate。以上值表示迁移后需重新对账的保守初始状态,不伪造媒体已就绪;失败仍整体回滚。实施结果与证据
3dd4890;排错文档提交:6257859;待验收归档提交:d0185ca。fix/95-sense-media-path-constraint → dev),已合入dev,merge commit12e1bff8b4af0ced2b4f040654e6440c59d60b3d。1a452e9aafdfe01580f37f9179584b89516cf992;任务归档 revision89f668bc6f3308edbc1ce874c9b0a189dd418d42。go test ./...、go vet ./...、go build ./...与定向 PostgreSQL race 测试通过。2026081419000已登记;idx_sense_media_routes_path唯一索引有效。7E35394F6377F9F4AB0046E8413F29B140D6F301383C54C87CE871B435EF253D。Web、SPA、health、MediaMTX 均返回 200,停止脚本执行后相关端口无监听。git diff --check和任务 Wiki 定向同步检查通过。Harness strict 仅被既存 #66/#67 归档格式问题阻塞,与本任务改动无关。人工验收(2026-08-16)
dev,merge commit:12e1bff8b4af0ced2b4f040654e6440c59d60b3d;main未变更。5f3bdf3786f2a72dac5d29236ff466743e2912b5;验收镜像提交:15bd0008163704da6797214545d0cb94fc3d2e50。用户已明确指示执行 #95。前置 #92 已关闭并合入
dev;修复分支fix/95-sense-media-path-constraint从最新dev@4040970创建,工作区干净。真实库只读证据与迁移前仓库外备份均已确认;先在隔离 PostgreSQL 复现和验证,未通过前不继续写真实库。首轮隔离回归获得预期的渐进反馈:旧 path 约束已被正确识别并越过原 SQLSTATE 42704,随后非空旧表在新增
source_ready NOT NULL时触发 SQLSTATE 23502。测试数据库已在失败后删除。按工单保留路由与完整迁移目标,已补充确定性运行态列回填方案。#95 已完成实现、测试、真实数据库迁移验证、Windows 包回归、Wiki 更新、归档和推送,现进入“待验收”。
d0185caa0e0c96ba34f10486910a79f26af576233dd489089f668bc6f3308edbc1ce874c9b0a189dd418d427E35394F6377F9F4AB0046E8413F29B140D6F301383C54C87CE871B435EF253D工单与 PR 保持 open,等待用户人工验收;未自动合并到
dev,未关闭 #95。用户已于 2026-08-16 明确验收通过。PR #96 已合入
dev(merge commit12e1bff8b4af0ced2b4f040654e6440c59d60b3d);Wiki 归档及镜像已更新。main未变更。