diff --git a/internal/db/db.go b/internal/db/db.go index 339e2f2..886b7df 100644 --- a/internal/db/db.go +++ b/internal/db/db.go @@ -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 { diff --git a/internal/db/update.go b/internal/db/update.go index 70f6cb6..347bd3c 100644 --- a/internal/db/update.go +++ b/internal/db/update.go @@ -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) + } +} diff --git a/script/install.sh b/script/install.sh index a4cda7d..823929f 100755 --- a/script/install.sh +++ b/script/install.sh @@ -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() {