| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Hasql.Query
Documentation
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 thenreturnA-< () 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.statementsql encoder decoder True where sql = "select ($1 + $2)" encoder =contramapfst(Hasql.Encoders.valueHasql.Encoders.int8)<>contramapsnd(Hasql.Encoders.valueHasql.Encoders.int8) decoder = Hasql.Decoders.singleRow(Hasql.Decoders.valueHasql.Decoders.int8)
The statement above accepts a product of two parameters of type Int64
and produces a single result of type Int64.