Files
2026-06-30 15:14:37 +08:00

78 lines
2.9 KiB
SQL

-- 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 添加索引
- 理由:主要用于配置存储,不用于频繁查询
*/