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)]