From e9571835882ec4479b6679bf4676e62f5bf365fb Mon Sep 17 00:00:00 2001 From: dushixiang Date: Sat, 24 Jan 2026 19:49:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20weight=20=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E7=9A=84=E8=87=AA=E5=8A=A8=E5=8C=96=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=EF=BC=8C=E6=8C=89=E7=85=A7=20name=20=E9=A1=BA=E5=BA=8F?= =?UTF-8?q?=E5=88=86=E9=85=8D=20weight=EF=BC=8C=E4=BB=8E=201=20=E5=BC=80?= =?UTF-8?q?=E5=A7=8B=E9=80=92=E5=A2=9E=20fix=20#35?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/migrate/migrate.go | 7 +++ internal/migrate/v0_1_3/migrate.go | 68 ++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 internal/migrate/v0_1_3/migrate.go diff --git a/internal/migrate/migrate.go b/internal/migrate/migrate.go index 99c117e..29d9c1d 100644 --- a/internal/migrate/migrate.go +++ b/internal/migrate/migrate.go @@ -6,6 +6,7 @@ import ( "github.com/dushixiang/pika/internal/migrate/v0_1_1" "github.com/dushixiang/pika/internal/migrate/v0_1_2" + "github.com/dushixiang/pika/internal/migrate/v0_1_3" "github.com/dushixiang/pika/internal/service" "github.com/dushixiang/pika/pkg/version" "go.uber.org/zap" @@ -30,6 +31,12 @@ func AutoMigrate(logger *zap.Logger, db *gorm.DB, propertyService *service.Prope return err } } + // 升级到 v0.1.3 版本 + if strings.Compare(localVersion, "v0.1.3") < 0 { + if err := v0_1_3.Migrate(logger, db); err != nil { + return err + } + } return propertyService.SetSystemVersion(ctx, version.Version) } diff --git a/internal/migrate/v0_1_3/migrate.go b/internal/migrate/v0_1_3/migrate.go new file mode 100644 index 0000000..55a183b --- /dev/null +++ b/internal/migrate/v0_1_3/migrate.go @@ -0,0 +1,68 @@ +package v0_1_3 + +import ( + "github.com/dushixiang/pika/internal/models" + "go.uber.org/zap" + "gorm.io/gorm" +) + +func Migrate(logger *zap.Logger, db *gorm.DB) error { + logger.Info("开始执行 v0.1.3 版本数据迁移") + + migrator := db.Migrator() + if migrator == nil { + logger.Warn("无法获取数据库 migrator,跳过迁移") + return nil + } + + if !migrator.HasTable("agents") { + logger.Info("未检测到 agents 表,跳过迁移") + return nil + } + + // 检查 weight 字段是否存在 + if !migrator.HasColumn("agents", "weight") { + logger.Info("未检测到 weight 字段,跳过迁移") + return nil + } + + // 查询所有 weight 为 0 或 null 的 agents,按 name 升序排序 + var agents []models.Agent + if err := db.Where("weight = ? OR weight IS NULL", 0). + Order("name ASC"). + Find(&agents).Error; err != nil { + logger.Error("查询 agents 失败", zap.Error(err)) + return err + } + + if len(agents) == 0 { + logger.Info("没有需要更新 weight 的探针,跳过迁移") + return nil + } + + logger.Info("找到需要更新 weight 的探针", zap.Int("count", len(agents))) + + // 按照 name 顺序分配 weight,从 1 开始递增 + // 这样按 name 字母顺序排在前面的探针,weight 值较小 + // 而在列表中按 weight 降序排列时,name 靠后的会显示在前面 + for i, agent := range agents { + weight := i + 1 + if err := db.Model(&models.Agent{}). + Where("id = ?", agent.ID). + Update("weight", weight).Error; err != nil { + logger.Error("更新探针 weight 失败", + zap.String("id", agent.ID), + zap.String("name", agent.Name), + zap.Int("weight", weight), + zap.Error(err)) + return err + } + logger.Debug("已更新探针 weight", + zap.String("id", agent.ID), + zap.String("name", agent.Name), + zap.Int("weight", weight)) + } + + logger.Info("v0.1.3 版本数据迁移完成", zap.Int("updated", len(agents))) + return nil +}