diff --git a/internal/db/update.go b/internal/db/update.go index 3d57231..3e6a62b 100644 --- a/internal/db/update.go +++ b/internal/db/update.go @@ -135,19 +135,37 @@ 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()) - // } - // }() - // } + 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: + case conf.DatabaseTypeSqlite3: + if err := db.Exec("PRAGMA foreign_keys = OFF").Error; err != nil { + return err + } + defer func() { + err := db.Exec("PRAGMA foreign_keys = ON").Error + if err != nil { + log.Fatalf("failed to set foreign key checks: %s", err.Error()) + } + }() + return db.AutoMigrate(dst...) + case conf.DatabaseTypePostgres: + if err := db.Exec("SET CONSTRAINTS ALL DEFERRED").Error; err != nil { + return err + } + defer func() { + err := db.Exec("SET CONSTRAINTS ALL IMMEDIATE").Error + if err != nil { + log.Fatalf("failed to set foreign key checks: %s", err.Error()) + } + }() return db.AutoMigrate(dst...) default: return fmt.Errorf("unknown database type: %s", conf.Conf.Database.Type)