同步历史版本代码
This commit is contained in:
+30
-4
@@ -4,6 +4,7 @@ import (
|
||||
"errors"
|
||||
"time"
|
||||
|
||||
gomigrate "github.com/golang-migrate/migrate/v4"
|
||||
"github.com/perfect-panel/server/internal/model/user"
|
||||
"gorm.io/gorm"
|
||||
|
||||
@@ -18,16 +19,41 @@ func Migrate(ctx *svc.ServiceContext) {
|
||||
Config: ctx.Config.MySQL,
|
||||
}
|
||||
now := time.Now()
|
||||
if err := migrate.Migrate(mc.Dsn()).Up(); err != nil {
|
||||
migrator := migrate.Migrate(mc.Dsn())
|
||||
if err := migrator.Up(); err != nil {
|
||||
if errors.Is(err, migrate.NoChange) {
|
||||
logger.Info("[Migrate] database not change")
|
||||
return
|
||||
} else {
|
||||
var dirtyErr gomigrate.ErrDirty
|
||||
if errors.As(err, &dirtyErr) {
|
||||
logger.Errorf("[Migrate] Dirty database version %d detected, trying auto-recovery", dirtyErr.Version)
|
||||
forceVersion := int(dirtyErr.Version) - 1
|
||||
if forceVersion < 0 {
|
||||
forceVersion = 0
|
||||
}
|
||||
if forceErr := migrator.Force(forceVersion); forceErr != nil {
|
||||
logger.Errorf("[Migrate] Force version error: %v", forceErr.Error())
|
||||
panic(forceErr)
|
||||
}
|
||||
logger.Infof("[Migrate] Force version to %d, retrying migration", forceVersion)
|
||||
if retryErr := migrator.Up(); retryErr != nil && !errors.Is(retryErr, migrate.NoChange) {
|
||||
logger.Errorf("[Migrate] Retry Up error: %v", retryErr.Error())
|
||||
panic(retryErr)
|
||||
}
|
||||
} else {
|
||||
logger.Errorf("[Migrate] Up error: %v", err.Error())
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
logger.Errorf("[Migrate] Up error: %v", err.Error())
|
||||
panic(err)
|
||||
} else {
|
||||
logger.Info("[Migrate] Database change, took " + time.Since(now).String())
|
||||
}
|
||||
|
||||
if err := EnsureSchemaCompatibility(ctx); err != nil {
|
||||
logger.Errorf("[SchemaCompat] repair failed: %v", err.Error())
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// if not found admin user
|
||||
err := ctx.DB.Transaction(func(tx *gorm.DB) error {
|
||||
var count int64
|
||||
|
||||
Reference in New Issue
Block a user