Fix: Auto Migrate DB Must Change DB Version

pull/48/head
zijiren233 2 years ago
parent 21204cacf0
commit 59ada3bd54

@ -21,38 +21,11 @@ var (
func Init(d *gorm.DB, t conf.DatabaseType) error {
db = d
dbType = t
return AutoMigrate(
new(model.Setting),
new(model.User),
new(model.UserProvider),
new(model.Room),
new(model.RoomUserRelation),
new(model.Movie),
new(model.BilibiliVendor),
new(model.AlistVendor),
new(model.EmbyVendor),
new(model.VendorBackend),
)
}
func AutoMigrate(dst ...any) error {
var err error
switch conf.Conf.Database.Type {
case conf.DatabaseTypeMysql:
err = db.Set("gorm:table_options", "ENGINE=InnoDB CHARSET=utf8mb4").AutoMigrate(dst...)
case conf.DatabaseTypeSqlite3, conf.DatabaseTypePostgres:
err = db.AutoMigrate(dst...)
default:
log.Fatalf("unknown database type: %s", conf.Conf.Database.Type)
}
if err != nil {
return err
}
err = initRootUser()
err := UpgradeDatabase()
if err != nil {
return err
}
return upgradeDatabase()
return initRootUser()
}
func initRootUser() error {

@ -1,7 +1,10 @@
package db
import (
"fmt"
log "github.com/sirupsen/logrus"
"github.com/synctv-org/synctv/internal/conf"
"github.com/synctv-org/synctv/internal/model"
"gorm.io/gorm"
)
@ -11,16 +14,35 @@ type dbVersion struct {
Upgrade func(*gorm.DB) error
}
const CurrentVersion = "0.0.1"
const CurrentVersion = "0.0.2"
var models = []any{
new(model.Setting),
new(model.User),
new(model.UserProvider),
new(model.Room),
new(model.RoomUserRelation),
new(model.Movie),
new(model.BilibiliVendor),
new(model.AlistVendor),
new(model.EmbyVendor),
new(model.VendorBackend),
}
var dbVersions = map[string]dbVersion{
"0.0.1": {
NextVersion: "0.0.2-dev",
NextVersion: "0.0.2",
Upgrade: func(db *gorm.DB) error {
return db.Migrator().DropTable("streaming_vendor_infos")
},
},
"0.0.2": {
NextVersion: "",
Upgrade: nil,
},
}
func upgradeDatabase() error {
func UpgradeDatabase() error {
setting := model.Setting{
Name: "database_version",
Type: model.SettingTypeString,
@ -32,6 +54,12 @@ func upgradeDatabase() error {
return err
}
currentVersion := setting.Value
if currentVersion != CurrentVersion {
err = autoMigrate(models...)
if err != nil {
return err
}
}
version, ok := dbVersions[currentVersion]
if !ok {
return nil
@ -57,3 +85,21 @@ func upgradeDatabase() error {
}
return nil
}
func autoMigrate(dst ...any) error {
log.Info("migrating database...")
switch conf.Conf.Database.Type {
case conf.DatabaseTypeMysql:
if err := db.Exec("SET FOREIGN_KEY_CHECKS = 0").Error; err != nil {
return err
}
if err := db.Set("gorm:table_options", "ENGINE=InnoDB CHARSET=utf8mb4").AutoMigrate(dst...); err != nil {
return err
}
return db.Exec("SET FOREIGN_KEY_CHECKS = 1").Error
case conf.DatabaseTypeSqlite3, conf.DatabaseTypePostgres:
return db.AutoMigrate(dst...)
default:
return fmt.Errorf("unknown database type: %s", conf.Conf.Database.Type)
}
}

@ -51,6 +51,11 @@ function FixArgs() {
if [ "${GH_PROXY: -1}" != "/" ]; then
GH_PROXY="$GH_PROXY/"
fi
# 如果VERSION不是以v开头且不是latest、dev则补上v
if [[ "$VERSION" != v* ]] && [ "$VERSION" != "latest" ] && [ "$VERSION" != "dev" ]; then
VERSION="v$VERSION"
fi
}
function InitOS() {

Loading…
Cancel
Save