Files
SimpleArmaAdmin/internal/db/db.go

52 lines
1.2 KiB
Go

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
}