Files

52 lines
974 B
Go

package database
import (
"context"
"fmt"
"os"
"time"
"github.com/jackc/pgx/v5/pgxpool"
)
func Connect(ctx context.Context) (*pgxpool.Pool, error) {
dsn := fmt.Sprintf(
"postgres://%s:%s@%s:%s/%s?sslmode=disable",
getEnv("DB_USER", "shop"),
getEnv("DB_PASSWORD", "shop_secret"),
getEnv("DB_HOST", "localhost"),
getEnv("DB_PORT", "5432"),
getEnv("DB_NAME", "shop"),
)
cfg, err := pgxpool.ParseConfig(dsn)
if err != nil {
return nil, fmt.Errorf("parse config: %w", err)
}
cfg.MaxConns = 10
cfg.MinConns = 2
cfg.MaxConnLifetime = time.Hour
pool, err := pgxpool.NewWithConfig(ctx, cfg)
if err != nil {
return nil, fmt.Errorf("connect: %w", err)
}
for i := 0; i < 30; i++ {
if err := pool.Ping(ctx); err == nil {
return pool, nil
}
time.Sleep(time.Second)
}
return nil, fmt.Errorf("database not ready after 30s")
}
func getEnv(key, fallback string) string {
if v := os.Getenv(key); v != "" {
return v
}
return fallback
}