fix: close business flow regressions
This commit is contained in:
@@ -179,11 +179,10 @@ func migrateDatabase() error {
|
||||
if config.Spec.Databases == nil {
|
||||
return fmt.Errorf("database configuration is required")
|
||||
}
|
||||
var migrationDatabase interface {
|
||||
Migrator() gorm.Migrator
|
||||
}
|
||||
var migrationDatabase *gorm.DB
|
||||
var err error
|
||||
switch strings.ToLower(config.Spec.Databases.Driver) {
|
||||
driver := strings.ToLower(config.Spec.Databases.Driver)
|
||||
switch driver {
|
||||
case "postgres":
|
||||
migrationDatabase, err = database.NewPostgres(config.Spec.Databases.Source, nil)
|
||||
case "mysql":
|
||||
@@ -194,6 +193,9 @@ func migrateDatabase() error {
|
||||
if err != nil {
|
||||
return fmt.Errorf("connect database before migration: %w", err)
|
||||
}
|
||||
if err := prepareAdditiveMigrations(migrationDatabase, driver); err != nil {
|
||||
return err
|
||||
}
|
||||
const legacyPhoneIndex = "idx_platform_account_phone"
|
||||
if migrationDatabase.Migrator().HasIndex(&models.PlatformAccount{}, legacyPhoneIndex) {
|
||||
if err := migrationDatabase.Migrator().DropIndex(&models.PlatformAccount{}, legacyPhoneIndex); err != nil {
|
||||
@@ -210,3 +212,41 @@ func migrateDatabase() error {
|
||||
}
|
||||
return initdb.New(databaseService)
|
||||
}
|
||||
|
||||
// prepareAdditiveMigrations 先处理无法由 GORM AutoMigrate 安全完成的新增非空字段。
|
||||
// 旧轨迹没有服务端接收时间时,以定位发生时间(再退化到创建时间)回填,
|
||||
// 避免直接 ADD NOT NULL 因历史行存在而中断整库迁移。
|
||||
func prepareAdditiveMigrations(databaseService *gorm.DB, driver string) error {
|
||||
if !databaseService.Migrator().HasTable(&models.GasorderTrackPoint{}) {
|
||||
return nil
|
||||
}
|
||||
|
||||
var statements []string
|
||||
hasReceivedAt := databaseService.Migrator().HasColumn(&models.GasorderTrackPoint{}, "received_at")
|
||||
switch driver {
|
||||
case "postgres":
|
||||
if !hasReceivedAt {
|
||||
statements = append(statements, `ALTER TABLE "gasorder_track_point" ADD COLUMN "received_at" timestamptz`)
|
||||
}
|
||||
statements = append(statements,
|
||||
`UPDATE "gasorder_track_point" SET "received_at" = COALESCE("occurred_at", "created_at", CURRENT_TIMESTAMP) WHERE "received_at" IS NULL`,
|
||||
`ALTER TABLE "gasorder_track_point" ALTER COLUMN "received_at" SET NOT NULL`,
|
||||
)
|
||||
case "mysql":
|
||||
if !hasReceivedAt {
|
||||
statements = append(statements, "ALTER TABLE `gasorder_track_point` ADD COLUMN `received_at` datetime(3) NULL")
|
||||
}
|
||||
statements = append(statements,
|
||||
"UPDATE `gasorder_track_point` SET `received_at` = COALESCE(`occurred_at`, `created_at`, CURRENT_TIMESTAMP(3)) WHERE `received_at` IS NULL",
|
||||
"ALTER TABLE `gasorder_track_point` MODIFY COLUMN `received_at` datetime(3) NOT NULL",
|
||||
)
|
||||
default:
|
||||
return fmt.Errorf("unsupported database driver for additive migrations: %s", driver)
|
||||
}
|
||||
for _, statement := range statements {
|
||||
if err := databaseService.Exec(statement).Error; err != nil {
|
||||
return fmt.Errorf("backfill gasorder_track_point.received_at: %w", err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user