package postgresql import ( "errors" "fmt" "log" "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/pgxpool" "github.com/jackc/pgx/v5/stdlib" ) func RunMigrationsWithString(connectionString string, migrationDir string) error { m, err := migrate.New( "file://"+migrationDir, connectionString) if err != nil { return fmt.Errorf("apply migrations: %w", err) } if err := m.Up(); err != nil { return fmt.Errorf("apply migrations: %w", err) } if err = m.Up(); err != nil && !errors.Is(err, migrate.ErrNoChange) { return fmt.Errorf("apply migrations: %w", err) } log.Println("✅ Migrations applied") return nil } type MigrationHandler struct { migrate *migrate.Migrate } func (migration *MigrationHandler) Up() error { if err := migration.migrate.Up(); err != nil && !errors.Is(err, migrate.ErrNoChange) { return fmt.Errorf("apply migrations: %w", err) } log.Println("✅ Migrations applied") return nil } func (migration *MigrationHandler) Down() error { if err := migration.migrate.Down(); err != nil && !errors.Is(err, migrate.ErrNoChange) { return fmt.Errorf("apply migrations: %w", err) } log.Println("✅ Migrations applied") return nil } func NewMigrationWithInstance(pool *pgxpool.Pool, migrationDir string) (*MigrationHandler, error) { db := stdlib.OpenDBFromPool(pool) driver, err := postgres.WithInstance(db, &postgres.Config{}) if err != nil { return nil, fmt.Errorf("create migration driver: %w", err) } m, err := migrate.NewWithDatabaseInstance( "file://"+migrationDir, "postgres", driver) if err != nil { return nil, fmt.Errorf("create migrator: %w", err) } //m.Down() /*if err = m.Up(); err != nil && !errors.Is(err, migrate.ErrNoChange) { return fmt.Errorf("apply migrations: %w", err) } log.Println("✅ Migrations applied")*/ return &MigrationHandler{ migrate: m, }, nil }