package database import ( "database/sql" "errors" "fmt" "io/fs" "log/slog" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database/postgres" "github.com/golang-migrate/migrate/v4/source/iofs" ) func RunMigrations(db *sql.DB, migrationFS fs.FS) error { sourceDriver, err := iofs.New(migrationFS, ".") if err != nil { return fmt.Errorf("failed to load embedded migrations: %w", err) } defer func() { err := sourceDriver.Close() if err != nil { slog.Error("failed to close migrations source", slog.Any("error", err)) } }() dbDriver, err := postgres.WithInstance(db, &postgres.Config{}) if err != nil { return fmt.Errorf("failed to create migration db driver: %w", err) } m, err := migrate.NewWithInstance("iofs", sourceDriver, "postgres", dbDriver) if err != nil { return fmt.Errorf("failed to initialize migrator: %w", err) } slog.Info("running database migrations...") err = m.Up() if err != nil && !errors.Is(err, migrate.ErrNoChange) { return fmt.Errorf("failed to run database migrations: %w", err) } slog.Info("database migrations applied successfully") return nil }