// Package db opens the Postgres pool and applies embedded migrations. package db import ( "context" "database/sql" "embed" "fmt" "github.com/jackc/pgx/v5/pgxpool" _ "github.com/jackc/pgx/v5/stdlib" "github.com/pressly/goose/v3" ) //go:embed migrations/*.sql var migrations embed.FS func Open(ctx context.Context, url string) (*pgxpool.Pool, error) { pool, err := pgxpool.New(ctx, url) if err != nil { return nil, fmt.Errorf("connect: %w", err) } if err := pool.Ping(ctx); err != nil { pool.Close() return nil, fmt.Errorf("ping: %w", err) } return pool, nil } // Migrate applies all pending migrations using goose over database/sql. func Migrate(ctx context.Context, url string) error { sqldb, err := sql.Open("pgx", url) if err != nil { return err } defer sqldb.Close() goose.SetBaseFS(migrations) goose.SetLogger(goose.NopLogger()) if err := goose.SetDialect("postgres"); err != nil { return err } return goose.UpContext(ctx, sqldb, "migrations") }