fix: preserve legacy time casts throughout index migrations

This commit is contained in:
Yvan
2026-11-06 01:44:57 +08:00
parent bf67626830
commit 7c8148a5e5
3 changed files with 65 additions and 5 deletions
+13 -4
View File
@@ -44,11 +44,20 @@ func migrateRegistrationIndex(db *gorm.DB) error {
}
func addRegistrationIndex(db *gorm.DB) error {
return withLegacyRegistrationCast(db, func(conn *gorm.DB) error {
return conn.Exec("ALTER TABLE tab_user ADD INDEX idx_sw_user_registration(source_db,puid,sw_register_time_unix,id), ALGORITHM=INPLACE, LOCK=NONE").Error
})
}
func withLegacyRegistrationCast(db *gorm.DB, migrate func(*gorm.DB) error) error {
// 旧 SELECT CAST 会以警告方式接受尾部空格等历史值。建索引属于 DDL,
// 严格模式会把同一警告升级为错误;仅在固定连接的索引构建期间保持旧转换行为。
return db.Connection(func(conn *gorm.DB) (result error) {
// Keep the bound connection's base handle free of statement errors so
// restoration still executes after a failed ALTER TABLE.
fresh := func() *gorm.DB { return conn.Session(&gorm.Session{NewDB: true}) }
var previous string
if err := conn.Raw("SELECT @@session.sql_mode").Scan(&previous).Error; err != nil {
if err := fresh().Raw("SELECT @@session.sql_mode").Scan(&previous).Error; err != nil {
return err
}
modes := []string{}
@@ -57,14 +66,14 @@ func addRegistrationIndex(db *gorm.DB) error {
modes = append(modes, mode)
}
}
if err := conn.Exec("SET SESSION sql_mode=?", strings.Join(modes, ",")).Error; err != nil {
if err := fresh().Exec("SET SESSION sql_mode=?", strings.Join(modes, ",")).Error; err != nil {
return err
}
defer func() {
if err := conn.Exec("SET SESSION sql_mode=?", previous).Error; err != nil {
if err := fresh().Exec("SET SESSION sql_mode=?", previous).Error; err != nil {
result = errors.Join(result, err)
}
}()
return conn.Exec("ALTER TABLE tab_user ADD INDEX idx_sw_user_registration(source_db,puid,sw_register_time_unix,id), ALGORITHM=INPLACE, LOCK=NONE").Error
return migrate(fresh())
})
}