purescript-postgresql-client/README.md
2018-10-21 03:24:58 +02:00

91 lines
3.2 KiB
Markdown

# purescript-postgresql-client
purescript-postgresql-client is a PostgreSQL client library for PureScript.
## Install
To use this library, you need to add `pg` and `decimal.js` as an npm dependency. You can also
find first of them on [https://github.com/brianc/node-postgres][pg].
## Usage
This guide is a literate Purescript file which is compiled into testing module (using [`literate-purescript`](https://github.com/Thimoteus/literate-purescript) - check `bin/docs.sh`) so it is a little verbose.
Let's start with imports and some testing boilerplate.
``` purescript
module Test.Example where
import Prelude
import Database.PostgreSQL (defaultPoolConfiguration, execute, newPool, Query(Query), withConnection)
import Database.PostgreSQL.Row (Row0(Row0), Row3(Row3))
import Data.Decimal as Decimal
import Data.Maybe (Maybe(..))
import Data.Tuple.Nested ((/\))
import Effect.Aff (Aff)
-- Our interaction with db is performed asynchronously in `Aff`
run ∷ Aff Unit
run = do
-- Now we are able to setup connection. We are assuming here
-- that postgres is running on a standard local port.
-- We use `ident` authentication so configuration can be nearly empty.
-- It requires only database name which we pass to `newPool` function.
-- We want to close connection after a second (`idleTimeoutMillis` setting) because this code
-- would be run by our test suite ;-)
-- Of course you can provide additional configuration settings if you need to.
pool <- newPool ((defaultPoolConfiguration "purspg") { idleTimeoutMillis = Just 1000 })
withConnection pool \conn -> do
-- We can now create our temporary table which we are going to query in this example.
-- `execute` performs this query. It ignores result value by default.
execute conn (Query """
CREATE TEMPORARY TABLE foods (
name text NOT NULL,
delicious boolean NOT NULL,
price NUMERIC(4,2) NOT NULL,
added TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (name)
);
""") Row0
-- We can insert some data calling `execute` function with `INSERT` statement.
-- Please notice that we are passing a tuple of arguments to this query
-- using dedicated constructor (in this case `Row3`).
-- This library provides types from `Row0` to `Row19` and they are wrappers which
-- provides instances for automatic conversions from and to SQL values.
execute conn (Query """
INSERT INTO foods (name, delicious, price)
VALUES ($1, $2, $3)
""") (Row3 "pork" true (Decimal.fromString "8.30"))
-- You can also use nested tuples instead of `Row*` types but this can be a bit more
-- verbose. `/\` is just an alias for `Tuple` constructor.
execute conn (Query """
INSERT INTO foods (name, delicious, price)
VALUES ($1, $2, $3)
""") ("sauerkraut" /\ false /\ Decimal.fromString "3.30")
```
## Generating SQL Queries
The purspgpp preprocessor has been replaced by [sqltopurs], which is a code
generator instead of a preprocessor, and easier to use.
[sqltopurs]: https://github.com/rightfold/sqltopurs
## Testing
To run tests you have to prepare "purspg" database and use standard command: `pulp test`.