package database import ( "fmt" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database/postgres" _ "github.com/golang-migrate/migrate/v4/source/file" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/stdlib" "github.com/rs/zerolog/log" ) func RunMigrations(databaseURL string) error { // Open database connection for migrations config, err := pgx.ParseConfig(databaseURL) if err != nil { return fmt.Errorf("failed to parse database config: %w", err) } db := stdlib.OpenDB(*config) defer db.Close() driver, err := postgres.WithInstance(db, &postgres.Config{}) if err != nil { return fmt.Errorf("failed to create postgres driver: %w", err) } m, err := migrate.NewWithDatabaseInstance( "file://migrations", "postgres", driver, ) if err != nil { return fmt.Errorf("failed to create migrate instance: %w", err) } version, dirty, err := m.Version() if err != nil && err != migrate.ErrNilVersion { return fmt.Errorf("failed to get migration version: %w", err) } log.Info(). Uint("current_version", version). Bool("dirty", dirty). Msg("Current migration status") if err := m.Up(); err != nil && err != migrate.ErrNoChange { return fmt.Errorf("failed to run migrations: %w", err) } newVersion, _, err := m.Version() if err != nil { return fmt.Errorf("failed to get new migration version: %w", err) } log.Info(). Uint("new_version", newVersion). Msg("Migrations completed") return nil }