Opt: db upgrade func

pull/52/head
zijiren233 2 years ago
parent 6f389684fb
commit c5871b9175

@ -38,37 +38,22 @@ var dbVersions = map[string]dbVersion{
"0.0.2": {
NextVersion: "0.0.3",
Upgrade: func(db *gorm.DB) error {
// alist and emby movies path are changed, so we need to delete them
_ = db.Exec("DELETE FROM movies WHERE base_vendor_info_vendor IN ('alist', 'emby')").Error
_ = db.Migrator().DropTable("alist_vendors", "emby_vendors")
// delete all vendors, because we are going to change the more vendor table, e.g. bilibili_vendors
return db.Migrator().DropTable("streaming_vendor_infos")
},
},
"0.0.3": {
NextVersion: "",
Upgrade: func(db *gorm.DB) error {
// alist and emby movies path are changed, so we need to delete them
_ = db.Exec("DELETE FROM movies WHERE base_vendor_info_vendor IN ('alist', 'emby')").Error
return db.Migrator().DropTable("alist_vendors", "emby_vendors")
},
},
}
func UpgradeDatabase() error {
if conf.Conf.Database.Type == conf.DatabaseTypeMysql {
if err := db.Exec("SET FOREIGN_KEY_CHECKS = 0").Error; err != nil {
return err
}
defer func() {
err := db.Exec("SET FOREIGN_KEY_CHECKS = 1").Error
if err != nil {
log.Fatalf("failed to set foreign key checks: %s", err.Error())
}
}()
}
if !db.Migrator().HasTable(&model.Setting{}) {
return autoMigrate(models...)
}
setting := model.Setting{
Name: "database_version",
Type: model.SettingTypeString,
@ -88,28 +73,24 @@ func UpgradeDatabase() error {
}
}()
}
version, ok := dbVersions[currentVersion]
if !ok {
return nil
}
currentVersion = version.NextVersion
for currentVersion != "" {
version, ok := dbVersions[currentVersion]
if !ok {
break
}
log.Infof("Upgrading database to version %s", currentVersion)
if version.Upgrade != nil {
err := version.Upgrade(db)
if version.NextVersion != "" {
log.Infof("Upgrading database to version %s", version.NextVersion)
if version.Upgrade != nil {
err := version.Upgrade(db)
if err != nil {
return err
}
}
err := UpdateSettingItemValue("database_version", version.NextVersion)
if err != nil {
return err
}
}
err := UpdateSettingItemValue("database_version", currentVersion)
if err != nil {
return err
}
currentVersion = version.NextVersion
}
return nil
@ -119,6 +100,17 @@ func autoMigrate(dst ...any) error {
log.Info("migrating database...")
switch conf.Conf.Database.Type {
case conf.DatabaseTypeMysql:
if conf.Conf.Database.Type == conf.DatabaseTypeMysql {
if err := db.Exec("SET FOREIGN_KEY_CHECKS = 0").Error; err != nil {
return err
}
defer func() {
err := db.Exec("SET FOREIGN_KEY_CHECKS = 1").Error
if err != nil {
log.Fatalf("failed to set foreign key checks: %s", err.Error())
}
}()
}
return db.Set("gorm:table_options", "ENGINE=InnoDB CHARSET=utf8mb4").AutoMigrate(dst...)
case conf.DatabaseTypeSqlite3, conf.DatabaseTypePostgres:
return db.AutoMigrate(dst...)

Loading…
Cancel
Save