package db import ( "context" "fmt" "log" "strings" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgxpool" "gitlab.com/alexkavon/newsstand/src/conf" ) type Database struct { p *pgxpool.Pool } type DbValues pgx.NamedArgs func NewDb(config *conf.Conf) *Database { pool, err := pgxpool.New(context.Background(), config.Db.Url) if err != nil { log.Fatal(err) } var testquery string err = pool.QueryRow(context.Background(), "select 'Hello, PostgreSQL!'").Scan(&testquery) if err != nil { log.Fatal(err) } log.Println("Database connection pool created.", testquery) return &Database{ p: pool, } } func (d *Database) InsertTable(table string, columns []string, values DbValues) error { columnstr := stringifyColumns(columns, "") valuesstr := stringifyColumns(columns, "@") query := fmt.Sprintf("INSERT INTO %s (%s) VALUES (%s) RETURNING *", table, columnstr, valuesstr) log.Println(query, values) // Convert DbValues to pgx.NamedArgs type to use NamedArgs type features namedArgs := pgx.NamedArgs(values) // TODO Use r.Context() from HTTP Request? ctx := context.Background() row, err := d.p.Exec(ctx, query, namedArgs) if err != nil { return err } log.Println("Row", row) return nil } func (d *Database) Close() { d.p.Close() } func stringifyColumns(columns []string, prefix string) string { ncolumns := []string{} for _, v := range columns { ncolumns = append(ncolumns, fmt.Sprintf("%s%s", prefix, v)) } return strings.Join(ncolumns, ", ") }