package postgres import ( "context" "database/sql" "fmt" "time" _ "github.com/lib/pq" ) type Config struct { DSN string MaxOpenConns int MaxIdleConns int ConnMaxLifetime time.Duration } func Open(cfg Config) (*sql.DB, error) { if cfg.DSN == "" { return nil, fmt.Errorf("dsn is required") } db, err := sql.Open("postgres", cfg.DSN) if err != nil { return nil, err } if cfg.MaxOpenConns > 0 { db.SetMaxOpenConns(cfg.MaxOpenConns) } if cfg.MaxIdleConns > 0 { db.SetMaxIdleConns(cfg.MaxIdleConns) } if cfg.ConnMaxLifetime > 0 { db.SetConnMaxLifetime(cfg.ConnMaxLifetime) } ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := db.PingContext(ctx); err != nil { _ = db.Close() return nil, err } return db, nil }