Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/lpil/pgo

🐘 Use PostgreSQL databases with PGO
https://github.com/lpil/pgo

erlang gleam postgresql postgresql-client

Last synced: about 2 months ago
JSON representation

🐘 Use PostgreSQL databases with PGO

Awesome Lists containing this project

README

        

# Gleam PGO

A PostgreSQL database client for Gleam, based on [PGO][erlang-pgo].

[erlang-pgo]: https://github.com/erleans/pgo

```gleam
import gleam/pgo
import gleam/dynamic
import gleeunit/should

pub fn main() {
// Start a database connection pool.
// Typically you will want to create one pool for use in your program
let db = pgo.connect(pgo.Config(
..pgo.default_config(),
host: "localhost",
database: "my_database",
pool_size: 15,
))

// An SQL statement to run. It takes one int as a parameter
let sql = "
select
name, age, colour, friends
from
cats
where
id = $1"

// This is the decoder for the value returned by the query
let return_type = dynamic.tuple4(
dynamic.string,
dynamic.int,
dynamic.string,
dynamic.list(dynamic.string),
)

// Run the query against the PostgreSQL database
// The int `1` is given as a parameter
let assert Ok(response) =
pgo.execute(sql, db, [pgo.int(1)], return_type)

// And then do something with the returned results
response.count
|> should.equal(2)
response.rows
|> should.equal([
#("Nubi", 3, "black", ["Al", "Cutlass"]),
])
}
```

## Installation

```sh
gleam add gleam_pgo
```

## Atom generation

Creating a connection pool with the `pgo.connect` function dynamically generates
an Erlang atom. Atoms are not garbage collected and only a certain number of
them can exist in an Erlang VM instance, and hitting this limit will result in
the VM crashing. Due to this limitation you should not dynamically open new
connection pools, instead create the pools you need when your application starts
and reuse them throughout the lifetime of your program.