feat: 引入版本化数据库迁移与 Schema 启动门禁

This commit is contained in:
weijuesen
2026-08-13 22:51:45 +08:00
parent 20bea001ac
commit 8b977e4164
15 changed files with 779 additions and 45 deletions
+28 -19
View File
@@ -1,6 +1,7 @@
package database
import (
"fmt"
"log/slog"
"silk-server-go/internal/config"
@@ -21,30 +22,38 @@ func Init(cfg *config.Config) error {
return err
}
DB = db
// 自动迁移(错误不阻止启动,仅记录警告)
if err := db.AutoMigrate(
&model.User{}, &model.Room{}, &model.Device{}, &model.Sensor{},
&model.Threshold{}, &model.Alarm{}, &model.Camera{}, &model.VideoClip{},
&model.AuditLog{}, &model.Telemetry{},
&model.Permission{}, &model.RolePermission{},
&model.Disease{}, &model.KnowledgeArticle{},
&model.InspectionRecord{},
&model.Tray{}, &model.Batch{}, &model.RearingRecord{},
&model.WechatBinding{},
&model.WeatherAlert{},
&model.LampTest{}, &model.LampTestStep{},
&model.Consumable{},
&model.Consultation{},
&model.SpectrumEntry{},
&model.TraceRecord{},
); err != nil {
slog.Warn("自动迁移有警告(可忽略)", "err", err)
if err := RunMigrations(db); err != nil {
return err
}
if err := CheckSchemaVersion(db, CurrentSchemaVersion); err != nil {
return err
}
if cfg.AllowDevAutoMigrate && cfg.AppEnv != "production" {
if err := db.AutoMigrate(
&model.User{}, &model.Room{}, &model.Device{}, &model.Sensor{},
&model.Threshold{}, &model.Alarm{}, &model.Camera{}, &model.VideoClip{},
&model.AuditLog{}, &model.Telemetry{},
&model.Permission{}, &model.RolePermission{},
&model.Disease{}, &model.KnowledgeArticle{},
&model.InspectionRecord{},
&model.Tray{}, &model.Batch{}, &model.RearingRecord{},
&model.WechatBinding{},
&model.WeatherAlert{},
&model.LampTest{}, &model.LampTestStep{},
&model.Consumable{},
&model.Consultation{},
&model.SpectrumEntry{},
&model.TraceRecord{},
); err != nil {
return fmt.Errorf("开发环境 AutoMigrate 失败: %w", err)
}
slog.Warn("开发环境 AutoMigrate 已启用,SQL 迁移仍是生产 schema 事实来源")
}
// 初始化权限种子数据
seedPermissions(db)
// 初始化知识库种子数据
seedKnowledge(db)
slog.Info("数据库连接成功,自动迁移完成")
slog.Info("数据库连接成功,版本化迁移完成", "schemaVersion", CurrentSchemaVersion)
return nil
}