package db import ( "embed" "errors" "fmt" "github.com/golang-migrate/migrate/v4" _ "github.com/golang-migrate/migrate/v4/database/postgres" "github.com/golang-migrate/migrate/v4/source/iofs" ) //go:embed migrations/*.sql var migrationsFS embed.FS // RunMigrations runs all pending database migrations. // It uses embedded SQL files and is safe to call on every startup. // Returns nil if migrations succeed or if there are no changes to apply. func RunMigrations(databaseURL string) error { source, err := iofs.New(migrationsFS, "migrations") if err != nil { return fmt.Errorf("failed to create migration source: %w", err) } m, err := migrate.NewWithSourceInstance("iofs", source, databaseURL) if err != nil { return fmt.Errorf("failed to create migrate instance: %w", err) } defer m.Close() if err := m.Up(); err != nil && !errors.Is(err, migrate.ErrNoChange) { return fmt.Errorf("failed to run migrations: %w", err) } return nil }