hasql-0.19.12: A very efficient PostgreSQL driver and a flexible mapping API

Safe HaskellNone




data Query a b Source

An abstraction over parametric queries.

It is composable using the standard interfaces of the category theory, which it has instances of. E.g., here's how you can compose queries using the Arrow notation:

-- |
-- Given an Update query,
-- which uses the @fmap (> 0) rowsAffected@ decoder
-- to detect, whether it had any effect,
-- and an Insert query,
-- produces a query which performs Upsert.
composeUpsert :: Query a Bool -> Query a () -> Query a ()
composeUpsert update insert =
  proc params -> do
    updated <- update -< params
    if updated
      then returnA -< ()
      else insert -< params

statement :: ByteString -> Params a -> Result b -> Bool -> Query a b Source

A specification of a strictly single-statement query, which can be parameterized and prepared.

Consists of the following:

  • SQL template,
  • params encoder,
  • result decoder,
  • a flag, determining whether it should be prepared.

The SQL template must be formatted according to Postgres' standard, with any non-ASCII characters of the template encoded using UTF-8. According to the format, parameters must be referred to using the positional notation, as in the following: $1, $2, $3 and etc. Those references must be used to refer to the values of the Params encoder.

Following is an example of the declaration of a prepared statement with its associated codecs.

selectSum :: Hasql.Query.Query (Int64, Int64) Int64
selectSum =
  Hasql.Query.statement sql encoder decoder True
    sql =
      "select ($1 + $2)"
    encoder =
      contramap fst (Hasql.Encoders.value Hasql.Encoders.int8) <>
      contramap snd (Hasql.Encoders.value Hasql.Encoders.int8)
    decoder =
      Hasql.Decoders.singleRow (Hasql.Decoders.value Hasql.Decoders.int8)

The statement above accepts a product of two parameters of type Int64 and produces a single result of type Int64.