Module

Control.Monad.Postgres.Base

Package
purescript-postgresql
Repository
cakekindel/purescript-postgresql

#PostgresT Source

newtype PostgresT :: forall k. (k -> Type) -> k -> Typenewtype PostgresT m a

Monad handling pool resource acquisition & release

runPostgres
  {connectionString: "postgresql://postgres:postgres@localhost:5432"}
  $ session do
      exec_ "create table foo (bar int);"
      exec_ "insert into foo values (1);"
      res <- query "select * from foo"
      pure $ res == 1

Is equivalent to:

do
  pool <- liftEffect $ Pool.make {connectionString: "postgresql://postgres:postgres@localhost:5432"}
  finally (Pool.end pool) do
    client <- Pool.connect pool
    finally (liftEffect $ Pool.release pool client) do
      Client.exec_ "create table foo (bar int);" client
      Client.exec_ "insert into foo values (1);" client
      res <- Client.query "select * from foo" client
      pure $ res == 1

Constructors

Instances

#MonadPostgres Source

class MonadPostgres :: (Type -> Type) -> (Type -> Type) -> (Type -> Type) -> Type -> Constraintclass (MonadSession session, MonadCursor cursor ct) <= MonadPostgres m session cursor ct | m -> ct cursor session where

Typeclass generalizing PostgresT. Allows for dependency-injecting different implementations of the idea of a postgres connection.

  • session - Session monad (for PostgresT this is SessionT)
  • cursor - Cursor session monad (for PostgresT this is CursorT)
  • ct - Open type parameter for cursor type. Don't pin this to a concrete type.

Members

  • session :: session ~> m

    Run a session in m.

  • transaction :: session ~> m

    Run a session in m, wrapped in a transaction.

    If any errors are raised, the transaction is rolled back and the error rethrown.

  • cursorWith :: forall q. AsQuery q => (Array Raw -> RepT ct) -> String -> q -> cursor ~> m

    cursor, but using a custom deserialize function for the data yielded by the cursor

Instances

#cursor Source

cursor :: forall @cursort t session cursor q a. MonadPostgres t session cursor cursort => AsQuery q => FromRow cursort => String -> q -> cursor a -> t a

Create a server-side cursor for a query in a transaction, and execute a CursorT with a view to the new cursor.

#withPool Source

withPool :: forall m a. PostgresT m a -> Pool -> m a

Execute a PostgresT using an existing connection pool.

This will not invoke Pool.end after executing.

#runPostgres Source

runPostgres :: forall m a missing trash r e f. MonadBracket e f m => MonadAff m => Union r missing (Config trash) => Record r -> PostgresT m a -> m a

Create a new connection pool from the provided config and execute the postgres monad, invoking Effect.Aff.Postgres.Pool.end afterwards.