fix: resolve data loss in task environments and tags migration (#131)
This commit is contained in:
@@ -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"),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user