-- MeshRay 数据库迁移脚本 -- 功能:为 devices 表添加增强模式支持字段 -- 创建时间:2026-03-25 -- 关联任务:P0-2 - SwitchMode 功能实现 -- ============================================================ -- 1. 添加 Endpoint 字段(用于保存原始公网地址) -- ============================================================ -- 说明: -- - 原生模式:Endpoint 保存设备的真实公网地址(host:port) -- - 增强模式:当需要回退到原生模式时,从 Endpoint 恢复原始地址 -- - 格式:"192.168.1.100:51820" 或 "[::1]:51820" -- - 最大长度:255 (IPv6) + 1 (冒号) + 5 (端口) = 261 ALTER TABLE devices ADD COLUMN endpoint VARCHAR(261) DEFAULT ''; -- ============================================================ -- 2. 添加 IsRelayCapable 字段(是否可作为 Mesh 中继节点) -- ============================================================ -- 说明: -- - true: 该设备可以作为中继节点,帮助其他设备转发数据 -- - false: 该设备仅作为普通终端设备 -- - 默认值:false(所有新设备默认为普通设备) ALTER TABLE devices ADD COLUMN is_relay_capable BOOLEAN DEFAULT FALSE; -- ============================================================ -- 3. 验证迁移结果 -- ============================================================ -- 检查新增字段是否存在 SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'devices' AND COLUMN_NAME IN ('endpoint', 'is_relay_capable'); -- 统计现有设备数量 SELECT COUNT(*) AS total_devices, SUM(CASE WHEN endpoint != '' THEN 1 ELSE 0 END) AS devices_with_endpoint, SUM(CASE WHEN is_relay_capable = TRUE THEN 1 ELSE 0 END) AS relay_capable_devices FROM devices; -- ============================================================ -- 4. 回滚脚本(如果需要撤销迁移) -- ============================================================ /* -- ⚠️ 警告:执行回滚将删除新增字段,请谨慎操作! BEGIN TRANSACTION; ALTER TABLE devices DROP COLUMN endpoint; ALTER TABLE devices DROP COLUMN is_relay_capable; COMMIT; */ -- ============================================================ -- 5. 备注 -- ============================================================ /* 设计决策: 1. endpoint 使用 VARCHAR(261) 而不是 TEXT - 理由:固定最大长度,查询性能更好 - 261 = 255 (IPv6 最大长度) + 1 (冒号) + 5 (端口号最大值 65535) 2. is_relay_capable 使用 BOOLEAN 而不是 INT - 理由:语义更清晰,GORM 自动映射为 bool 类型 3. 默认值设置: - endpoint: '' (空字符串) - 避免 NULL 判断 - is_relay_capable: FALSE - 默认不作为中继节点 4. 索引策略: - 暂时不为 endpoint 添加索引 - 理由:主要用于配置存储,不用于频繁查询 */