chore: migrate database in background

* do database migration in background for fast startup time
* the caveat is: for the first time startup, service is not available until the migration is done
This commit is contained in:
canghai118 2023-11-30 08:18:47 +00:00
parent 0e73418cdf
commit ae2b442a96

View File

@ -1,14 +1,16 @@
package model package model
import ( import (
"gorm.io/driver/mysql" "fmt"
"gorm.io/driver/postgres"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"one-api/common" "one-api/common"
"os" "os"
"strings" "strings"
"time" "time"
"gorm.io/driver/mysql"
"gorm.io/driver/postgres"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
) )
var DB *gorm.DB var DB *gorm.DB
@ -82,38 +84,14 @@ func InitDB() (err error) {
if !common.IsMasterNode { if !common.IsMasterNode {
return nil return nil
} }
common.SysLog("database migration started")
err = db.AutoMigrate(&Channel{}) // migrate database in the background, to avoid blocking application startup
if err != nil { go func() {
return err err = migrateDB(db)
} if err != nil {
err = db.AutoMigrate(&Token{}) common.FatalLog(fmt.Errorf("migrateDB error: %v", err))
if err != nil { }
return err }()
}
err = db.AutoMigrate(&User{})
if err != nil {
return err
}
err = db.AutoMigrate(&Option{})
if err != nil {
return err
}
err = db.AutoMigrate(&Redemption{})
if err != nil {
return err
}
err = db.AutoMigrate(&Ability{})
if err != nil {
return err
}
err = db.AutoMigrate(&Log{})
if err != nil {
return err
}
common.SysLog("database migrated")
err = createRootAccountIfNeed()
return err
} else { } else {
common.FatalLog(err) common.FatalLog(err)
} }
@ -128,3 +106,39 @@ func CloseDB() error {
err = sqlDB.Close() err = sqlDB.Close()
return err return err
} }
func migrateDB(db *gorm.DB) error {
common.SysLog("database migration started")
var err error
err = db.AutoMigrate(&Channel{})
if err != nil {
return err
}
err = db.AutoMigrate(&Token{})
if err != nil {
return err
}
err = db.AutoMigrate(&User{})
if err != nil {
return err
}
err = db.AutoMigrate(&Option{})
if err != nil {
return err
}
err = db.AutoMigrate(&Redemption{})
if err != nil {
return err
}
err = db.AutoMigrate(&Ability{})
if err != nil {
return err
}
err = db.AutoMigrate(&Log{})
if err != nil {
return err
}
common.SysLog("database migrated")
err = createRootAccountIfNeed()
return err
}