fix: resolve data loss in task environments and tags migration (#131)

This commit is contained in:
duorameng
2026-06-15 10:28:38 +08:00
parent b54a7f476a
commit 98d1256f55
+25 -14
View File
@@ -43,10 +43,10 @@ func Migrate() error {
} }
} }
// 执行自定义迁移 // 执行前置结构迁移
logger.Info("[Database] 正在执行自定义迁移与表结构同步...") logger.Info("[Database] 正在执行前置结构迁移与表结构同步...")
if err := customMigrations(); err != nil { if err := preMigrations(); err != nil {
logger.Warnf("[Database] 自定义迁移警告: %v", err) logger.Warnf("[Database] 前置结构迁移警告: %v", err)
} }
logger.Infof("[Database] 正在同步 %d 个数据模型的表结构...", len(allModels)) logger.Infof("[Database] 正在同步 %d 个数据模型的表结构...", len(allModels))
@@ -54,6 +54,11 @@ func Migrate() error {
return err return err
} }
// 执行后置数据迁移,依赖完整的表结构
if err := postMigrations(); err != nil {
logger.Warnf("[Database] 后置数据迁移警告: %v", err)
}
// 3. 更新指纹记录 // 3. 更新指纹记录
if DB.Migrator().HasTable(&models.Setting{}) { if DB.Migrator().HasTable(&models.Setting{}) {
var sigSetting models.Setting var sigSetting models.Setting
@@ -98,8 +103,8 @@ func getModelSignature(models []interface{}) string {
return hex.EncodeToString(hash[:]) return hex.EncodeToString(hash[:])
} }
// customMigrations 自定义迁移,处理 AutoMigrate 无法自动解决的变更 // preMigrations 前置结构迁移,处理 AutoMigrate 无法自动解决的变更
func customMigrations() error { func preMigrations() error {
// 检查 ql_tokens 表是否存在 // 检查 ql_tokens 表是否存在
if DB.Migrator().HasTable("ql_tokens") { if DB.Migrator().HasTable("ql_tokens") {
// 如果 code 列存在,且 token 列不存在,则重命名 // 如果 code 列存在,且 token 列不存在,则重命名
@@ -118,9 +123,15 @@ func customMigrations() error {
} }
} }
migrateTaskTags() return nil
migrateTaskEnvs() }
// postMigrations 数据后置迁移,用于需要依赖完整表结构的数据搬运
func postMigrations() error {
// 迁移任务标签到通用的数据关联表中
migrateTaskTags()
// 迁移任务绑定的环境变量到通用的数据关联表中
migrateTaskEnvs()
return nil return nil
} }
@@ -129,7 +140,7 @@ func migrateTaskEnvs() {
// 检查 settings 表中是否已经记录了迁移状态 // 检查 settings 表中是否已经记录了迁移状态
if DB.Migrator().HasTable(&models.Setting{}) { if DB.Migrator().HasTable(&models.Setting{}) {
var setting models.Setting var setting models.Setting
res := DB.Where(&models.Setting{Section: "system", Key: "task_envs_migrated"}).Limit(1).Find(&setting) res := DB.Where(&models.Setting{Section: "system", Key: "task_envs_migrated_v2"}).Limit(1).Find(&setting)
if res.RowsAffected > 0 && string(setting.Value) == "true" { if res.RowsAffected > 0 && string(setting.Value) == "true" {
return return
} }
@@ -185,14 +196,14 @@ func markTaskEnvsMigrated() {
return return
} }
var setting models.Setting var setting models.Setting
res := DB.Where(&models.Setting{Section: "system", Key: "task_envs_migrated"}).Limit(1).Find(&setting) res := DB.Where(&models.Setting{Section: "system", Key: "task_envs_migrated_v2"}).Limit(1).Find(&setting)
if res.RowsAffected > 0 { if res.RowsAffected > 0 {
DB.Model(&setting).Update("value", models.BigText("true")) DB.Model(&setting).Update("value", models.BigText("true"))
} else { } else {
DB.Create(&models.Setting{ DB.Create(&models.Setting{
ID: xid.New().String(), ID: xid.New().String(),
Section: "system", Section: "system",
Key: "task_envs_migrated", Key: "task_envs_migrated_v2",
Value: models.BigText("true"), Value: models.BigText("true"),
}) })
} }
@@ -203,7 +214,7 @@ func migrateTaskTags() {
// 检查 settings 表中是否已经记录了迁移状态 // 检查 settings 表中是否已经记录了迁移状态
if DB.Migrator().HasTable(&models.Setting{}) { if DB.Migrator().HasTable(&models.Setting{}) {
var setting models.Setting var setting models.Setting
res := DB.Where(&models.Setting{Section: "system", Key: "task_tags_migrated"}).Limit(1).Find(&setting) res := DB.Where(&models.Setting{Section: "system", Key: "task_tags_migrated_v2"}).Limit(1).Find(&setting)
if res.RowsAffected > 0 && string(setting.Value) == "true" { if res.RowsAffected > 0 && string(setting.Value) == "true" {
return return
} }
@@ -271,14 +282,14 @@ func markTaskTagsMigrated() {
return return
} }
var setting models.Setting var setting models.Setting
res := DB.Where(&models.Setting{Section: "system", Key: "task_tags_migrated"}).Limit(1).Find(&setting) res := DB.Where(&models.Setting{Section: "system", Key: "task_tags_migrated_v2"}).Limit(1).Find(&setting)
if res.RowsAffected > 0 { if res.RowsAffected > 0 {
DB.Model(&setting).Update("value", models.BigText("true")) DB.Model(&setting).Update("value", models.BigText("true"))
} else { } else {
DB.Create(&models.Setting{ DB.Create(&models.Setting{
ID: xid.New().String(), ID: xid.New().String(),
Section: "system", Section: "system",
Key: "task_tags_migrated", Key: "task_tags_migrated_v2",
Value: models.BigText("true"), Value: models.BigText("true"),
}) })
} }