// package db serves as a database wrapper for adonis package db import ( "context" "fmt" "os" "time" "github.com/jackc/pgx/v5/pgxpool" ) type Database struct { conn *pgxpool.Pool } func NewDatabase(username, password, hostname, database string) *Database { // pool ensures thread safety url := url(username, password, hostname, database) dbpool, err := pgxpool.New(context.Background(), url) for err != nil { dbpool, err = pgxpool.New(context.Background(), url) fmt.Fprintf(os.Stderr, "Unable to create connection pool: %v\nRetrying...\n", err) //os.Exit(1) time.Sleep(1 * time.Second) } var greeting string err = dbpool.QueryRow(context.Background(), "select 'Hello, world!'").Scan(&greeting) if err != nil { fmt.Fprintf(os.Stderr, "QueryRow failed: %v\n", err) os.Exit(1) } fmt.Println(greeting) return &Database{conn: dbpool} } // this function assumes default port because i cant be bothered func url(username, password, hostname, database string) string { // generate url based on passed params // safe to disable SSL as comms occur over docker network return fmt.Sprintf("postgresql://%s:%s@%s/%s?sslmode=disable", username, password, hostname, database) }