fix: preserve legacy time casts throughout index migrations
This commit is contained in:
@@ -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())
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user