// Package migrate runs database schema migrations embedded in the binary. package migrate import ( "errors" "fmt" "github.com/golang-migrate/migrate/v4" _ "github.com/golang-migrate/migrate/v4/database/postgres" "github.com/golang-migrate/migrate/v4/source/iofs" "osdb/migrations" ) func newMigrator(databaseURL string) (*migrate.Migrate, error) { src, err := iofs.New(migrations.FS, ".") if err != nil { return nil, fmt.Errorf("create iofs source: %w", err) } m, err := migrate.NewWithSourceInstance("iofs", src, databaseURL) if err != nil { return nil, fmt.Errorf("create migrator: %w", err) } return m, nil } // Up applies all pending migrations. func Up(databaseURL string) error { m, err := newMigrator(databaseURL) if err != nil { return err } defer m.Close() if err := m.Up(); err != nil && !errors.Is(err, migrate.ErrNoChange) { return fmt.Errorf("migrate up: %w", err) } return nil } // Down rolls back a single migration step. func Down(databaseURL string) error { m, err := newMigrator(databaseURL) if err != nil { return err } defer m.Close() if err := m.Steps(-1); err != nil && !errors.Is(err, migrate.ErrNoChange) { return fmt.Errorf("migrate down: %w", err) } return nil }