package db import ( "context" "fmt" "log" "os" "path/filepath" "time" "github.com/jackc/pgx/v5/pgxpool" ) func Connect(ctx context.Context, databaseURL string) (*pgxpool.Pool, error) { cfg, err := pgxpool.ParseConfig(databaseURL) if err != nil { return nil, fmt.Errorf("parse database url: %w", err) } cfg.MaxConns = 20 cfg.MinConns = 2 cfg.MaxConnLifetime = time.Hour pool, err := pgxpool.NewWithConfig(ctx, cfg) 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 } func Migrate(ctx context.Context, pool *pgxpool.Pool, migrationsDir string) error { path := filepath.Join(migrationsDir, "001_schema.sql") data, err := os.ReadFile(path) if err != nil { return fmt.Errorf("read migration %s: %w", path, err) } if _, err := pool.Exec(ctx, string(data)); err != nil { return fmt.Errorf("apply schema: %w", err) } log.Println("database schema applied") return nil }