fix: close business flow regressions

This commit is contained in:
david
2026-07-31 11:33:28 +08:00
parent 42a2322c8e
commit a47e9025d0
18 changed files with 403 additions and 30 deletions

View File

@@ -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
}

View File

@@ -0,0 +1,18 @@
package main
import (
"testing"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
func TestPrepareAdditiveMigrationsSkipsMissingLegacyTable(t *testing.T) {
databaseService, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
if err != nil {
t.Fatalf("open sqlite database: %v", err)
}
if err := prepareAdditiveMigrations(databaseService, "postgres"); err != nil {
t.Fatalf("missing legacy table should not require a backfill: %v", err)
}
}