Parser for SQL augmented with types.
Base package for parsing queries, the idea is to use SQL language to write queries, and TH to make them usable with haskell
typedquery
Parser for SQL augmented with types
Till it finalised I would recomend installing it: with cabal -f debug-typed-queries
just to see what is gonig on. As the SQL parser is not complete, and will need a major lift to make it readable and sane... however it works fine for all queries I need.
This package provides base parsing facilities for possibly all *-simple database packages converting them into *-simpel-typed
- https://github.com/tolysz/mysql-simple-typed
- https://github.com/tolysz/sqlite-simple-typed
- https://github.com/tolysz/postgresql-simple-typed
example: https://github.com/tolysz/sqlite-simple-typed/blob/master/example/src/Main.hs
The basic idea is to start using SQL again, but use comemnts (--
) to hide haskell annotation.
This started as QuasiQuotes
excercise with the TH inpired printf
.
genJsonQuery
produces[Value]
genTypedQuery
produces[(T1,...,Tn)]
tuples,[T]
or()
all depending on theSQL
query
If you do not provide value (or a mean to get on inside query you need to give it outside.
They do the same:
$(genJsonQuery "SET SESSION group_concat_max_len = ? ") conn (10000 :: Int)
$(genJsonQuery "SET SESSION group_concat_max_len = ? -- Int ") conn 10000
$(genJsonQuery "SET SESSION group_concat_max_len = ? -- Int -- < 1000 ") conn
$(genJsonQuery "SET SESSION group_concat_max_len = ? -- < (1000 :: Int) ") conn
There is a basic syntax, and the base idea is to have a nice easy for eye syntax. It fires the correct execute
or query
with or without _
depending on the actual SQL
syntax
The parser is not complete, I will try to add as many issues there are and try to fix it.
Adnotations start with --
as otherwise HeidiSQL
was complaining, then ><~
or just text.
syntax | equivalent |
---|---|
bal -- Type | (\v -> v :: Bla) |
bla -- > f | (\v -> f bla ) |
bla -- Type -- > f | (\v -> (f bla):: Type ) |
? -- Type -- < var | ?? |
? -- < var | ?? |
? -- < var | ?? |
? -- ~ verbatim | ?? |
Eg.
$(genJsonQuery [qq| insert into some_table
( timeAsSQLfunction -- ~ now ()
, someInputfromAesonViaLens -- Int -- < v ^? (key "coolValue" . _Integral) ^. non 3
, someUserName -- Text -- < someNameFromContext
) |]) conn
Translates to
execute conn [qq| insert into some_table
( timeAsSQLfunction, someInputfromAesonViaLens, someUserName )
values ( now (), ?, ?) |]
[( (v ^? (key "coolValue" . _Integral) ^. non 3 ) :: Int, someNameFromContext Text)]