[Haskell-cafe] Announce: HDBI-1.3 and friends

Gauthier Segay gauthier.segay at gmail.com
Tue Oct 15 19:05:31 UTC 2013

Thanks for the announcement / library, I have started using hdbc (and
it's odbc driver) recently and had two concerns with it so far:

* ability to use named parameters
* fetching multiple results returned from single statement
(in .net this is done via

Is there any plan to get this supported in HDBI?

On Tue, Oct 15, 2013 at 7:55 PM, Alexey Uimanov <s9gf4ult at gmail.com> wrote:
> Hello haskellers!
> HDBI is the fork of HDBC but reworked. It supports SQlite3 and Postgresql
> for now. It also supports streaming with coduits.
> There is TH deriving mechanism to map database rows to Haskell structures
> and back. HDBI is trying to become simple
> but still powerfull and flexible database interface. It must be suitable to
> become the common RDBMS interface  for higher level interfaces
> like persistent or haskelldb.
> The documentation is not very good, while I have no enough time to make
> some.
> In this version changed typeclass signatures of Connection and Statement.
> Now methods `run` and `execute` get any instance of `ToRow` and method
> `fetch` return an instance of `FromRow`.
> Note that [SqlValue] is also an instance of `FromRow` and `ToRow`
> typeclasses so you do not loose the control.
> Methods `fromRow` and `toRow` for [SqlValue] are just `id`. SQlite and
> Postgresql drivers are fixed as well as hdbi-conduit.
> There is also new helper functions, like `onei :: Integer -> [SqlValue]`
> which helps you to execute queries with one parameter
> or execute many queries consistinf of one parameter.
> Prelude Database.HDBI Database.HDBI.SQlite> :set -XScopedTypeVariables
> Prelude Database.HDBI Database.HDBI.SQlite> :set -XOverloadedStrings
> Prelude Database.HDBI Database.HDBI.SQlite> c <- connectSqlite3 ":memory:"
> Prelude Database.HDBI Database.HDBI.SQlite> runRaw c "create table test(val
> integer)"
> Prelude Database.HDBI Database.HDBI.SQlite> withTransaction c $ runMany c
> "insert into test(val) values (?)" $ map one [1..1000]
> <interactive>:7:76: Warning:
>     Defaulting the following constraint(s) to type `Integer'
> .........
> Prelude Database.HDBI Database.HDBI.SQlite> r :: (Maybe Integer) <-
> runFetchOne c "select sum(val) from test" ()
> Prelude Database.HDBI Database.HDBI.SQlite> r
> Just 500500
> Note here that the empty set is used as a parameter of query in
> `runFetchOne`. Empty set is an instance of `FromRow` and `ToRow` and return
> an empty list of [SqlValue].
> Use empty list as a parameters is bad idea, because we could instantiate
> some another list of things, suppose the [Integer] as `FromRow` and
> `ToRow` instance. So it would lead to ambigous type because [SqlValue] is
> also a list instantiating `FromRow` and `ToRow`.
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe

More information about the Haskell-Cafe mailing list