package db import ( "database/sql" "fmt" "log" "time" "github.com/golang-migrate/migrate/v4" _ "github.com/golang-migrate/migrate/v4/database/postgres" _ "github.com/golang-migrate/migrate/v4/source/file" _ "github.com/lib/pq" ) // Connect initializes a standard sql.DB connection with retries. func Connect(dsn string) (*sql.DB, error) { var db *sql.DB var err error for i := 0; i < 10; i++ { db, err = sql.Open("postgres", dsn) if err == nil { err = db.Ping() if err == nil { return db, nil } } fmt.Printf("Failed to connect to database, retrying in 2s... (%d/10)\n", i+1) time.Sleep(2 * time.Second) } return nil, fmt.Errorf("failed to connect to database after retries: %w", err) } // RunMigrations runs the SQL migrations from internal/db/migrations. func RunMigrations(dsn string) error { m, err := migrate.New( "file://internal/db/migrations", dsn, ) if err != nil { return fmt.Errorf("could not create migrate instance: %w", err) } if err := m.Up(); err != nil && err != migrate.ErrNoChange { return fmt.Errorf("could not run up migrations: %w", err) } log.Println("Migrations completed successfully") return nil }