Copyright | (c) Kristof Bastiaensen 2020 |
---|---|
License | BSD-3 |
Maintainer | kristof@resonata.be |
Stability | unstable |
Portability | ghc |
Safe Haskell | None |
Language | Haskell2010 |
Synopsis
- data Query a
- data Command
- select :: Selector a -> QueryClauses -> Query a
- mergeSelect :: Query b -> (a -> b -> c) -> Selector a -> Query c
- replaceSelect :: Selector a -> Query b -> Query a
- data QueryClauses
- from :: QueryBuilder -> QueryClauses
- innerJoin :: [QueryBuilder] -> [QueryBuilder] -> QueryClauses
- leftJoin :: [QueryBuilder] -> [QueryBuilder] -> QueryClauses
- rightJoin :: [QueryBuilder] -> [QueryBuilder] -> QueryClauses
- outerJoin :: [QueryBuilder] -> [QueryBuilder] -> QueryClauses
- emptyJoins :: QueryClauses
- where_ :: [QueryBuilder] -> QueryClauses
- emptyWhere :: QueryClauses
- groupBy_ :: [QueryBuilder] -> QueryClauses
- having :: [QueryBuilder] -> QueryClauses
- emptyHaving :: QueryClauses
- orderBy :: [QueryOrdering] -> QueryClauses
- limit :: Int -> QueryClauses
- limitOffset :: Int -> Int -> QueryClauses
- data Selector a
- as :: QueryBuilder -> QueryBuilder -> QueryBuilder
- col :: FromSql a => QueryBuilder -> Selector a
- intCol :: (Show a, Bounded a, Integral a) => QueryBuilder -> Selector a
- integerCol :: QueryBuilder -> Selector Integer
- doubleCol :: QueryBuilder -> Selector Double
- floatCol :: QueryBuilder -> Selector Float
- scientificCol :: QueryBuilder -> Selector Scientific
- localTimeCol :: QueryBuilder -> Selector LocalTime
- timeOfDayCol :: QueryBuilder -> Selector TimeOfDay
- diffTimeCol :: QueryBuilder -> Selector DiffTime
- dayCol :: QueryBuilder -> Selector Day
- byteStringCol :: QueryBuilder -> Selector ByteString
- textCol :: QueryBuilder -> Selector Text
- values :: [QueryBuilder] -> Selector [MySQLValue]
- values_ :: [QueryBuilder] -> Selector ()
- subQuery :: ToQueryBuilder a => a -> QueryBuilder
- arg :: ToSql a => a -> QueryBuilder
- fun :: Text -> [QueryBuilder] -> QueryBuilder
- op :: Text -> QueryBuilder -> QueryBuilder -> QueryBuilder
- (.>) :: QueryBuilder -> QueryBuilder -> QueryBuilder
- (.+) :: QueryBuilder -> QueryBuilder -> QueryBuilder
- (.-) :: QueryBuilder -> QueryBuilder -> QueryBuilder
- data Insertor a
- insertValues :: QueryBuilder -> Insertor a -> [a] -> Command
- insertSelect :: QueryBuilder -> [QueryBuilder] -> [QueryBuilder] -> QueryClauses -> Command
- into :: ToSql b => (a -> b) -> Text -> Insertor a
- lensInto :: ToSql b => ((b -> Const b b) -> a -> Const b a) -> Text -> Insertor a
- insert1 :: ToSql a => Text -> Insertor a
- insert2 :: (ToSql a1, ToSql a2) => Text -> Text -> Insertor (a1, a2)
- insert3 :: (ToSql a1, ToSql a2, ToSql a3) => Text -> Text -> Text -> Insertor (a1, a2, a3)
- insert4 :: (ToSql a1, ToSql a2, ToSql a3, ToSql a4) => Text -> Text -> Text -> Text -> Insertor (a1, a2, a3, a4)
- insert5 :: (ToSql a1, ToSql a2, ToSql a3, ToSql a4, ToSql a5) => Text -> Text -> Text -> Text -> Text -> Insertor (a1, a2, a3, a4, a5)
- insert6 :: (ToSql a1, ToSql a2, ToSql a3, ToSql a4, ToSql a5, ToSql a6) => Text -> Text -> Text -> Text -> Text -> Text -> Insertor (a1, a2, a3, a4, a5, a6)
- insert7 :: (ToSql a1, ToSql a2, ToSql a3, ToSql a4, ToSql a5, ToSql a6, ToSql a7) => Text -> Text -> Text -> Text -> Text -> Text -> Text -> Insertor (a1, a2, a3, a4, a5, a6, a7)
- insert8 :: (ToSql a1, ToSql a2, ToSql a3, ToSql a4, ToSql a5, ToSql a6, ToSql a7, ToSql a8) => Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Insertor (a1, a2, a3, a4, a5, a6, a7, a8)
- insert9 :: (ToSql a1, ToSql a2, ToSql a3, ToSql a4, ToSql a5, ToSql a6, ToSql a7, ToSql a8, ToSql a9) => Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Insertor (a1, a2, a3, a4, a5, a6, a7, a8, a9)
- insert10 :: (ToSql a1, ToSql a2, ToSql a3, ToSql a4, ToSql a5, ToSql a6, ToSql a7, ToSql a8, ToSql a9, ToSql a10) => Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Insertor (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
- class ToSql a
- renderStmt :: ToQueryBuilder a => a -> ByteString
- renderPreparedStmt :: ToQueryBuilder a => a -> (ByteString, [MySQLValue])
- data SQLError
- data QueryBuilder
- class ToQueryBuilder a
- class FromSql a
Querying
Instances
ToQueryBuilder (Query a) Source # | |
Defined in Database.Hasqly toQueryBuilder :: Query a -> QueryBuilder |
Instances
ToQueryBuilder Command Source # | |
Defined in Database.Hasqly |
Query Clauses
data QueryClauses Source #
Instances
Semigroup QueryClauses Source # | |
Defined in Database.Hasqly (<>) :: QueryClauses -> QueryClauses -> QueryClauses # sconcat :: NonEmpty QueryClauses -> QueryClauses # stimes :: Integral b => b -> QueryClauses -> QueryClauses # | |
Monoid QueryClauses Source # | |
Defined in Database.Hasqly mempty :: QueryClauses # mappend :: QueryClauses -> QueryClauses -> QueryClauses # mconcat :: [QueryClauses] -> QueryClauses # |
from :: QueryBuilder -> QueryClauses Source #
innerJoin :: [QueryBuilder] -> [QueryBuilder] -> QueryClauses Source #
leftJoin :: [QueryBuilder] -> [QueryBuilder] -> QueryClauses Source #
rightJoin :: [QueryBuilder] -> [QueryBuilder] -> QueryClauses Source #
outerJoin :: [QueryBuilder] -> [QueryBuilder] -> QueryClauses Source #
where_ :: [QueryBuilder] -> QueryClauses Source #
groupBy_ :: [QueryBuilder] -> QueryClauses Source #
having :: [QueryBuilder] -> QueryClauses Source #
orderBy :: [QueryOrdering] -> QueryClauses Source #
limit :: Int -> QueryClauses Source #
limitOffset :: Int -> Int -> QueryClauses Source #
Selectors
Selectors contain the target fields or expressions in a SQL
SELECT statement, and perform the conversion to haskell. Selectors
are instances of Applicative
, so they can return the desired
haskell type.
as :: QueryBuilder -> QueryBuilder -> QueryBuilder Source #
combinator for aliasing columns.
polymorphic selector
col :: FromSql a => QueryBuilder -> Selector a Source #
The polymorphic selector. The return type is determined by type inference.
specialised selectors
The following are specialised versions of col
. Using these
may make refactoring easier, for example accidently swapping
and col
"age"
would not give a type error,
while col
"name"intCol "age"
and textCol "name"
most likely would.
integerCol :: QueryBuilder -> Selector Integer Source #
Un unbounded integer field, either a bounded integer (TINYINT, etc...) or DECIMAL in the database. Will throw a type error if the stored value is actually fractional.
WARNING: this function could potentially create huge integers with DECIMAL, if the exponent is large, even fillup the space and crash your program! Only use this on trusted inputs, or use Scientific instead.
scientificCol :: QueryBuilder -> Selector Scientific Source #
A DECIMAL or NUMERIC field.
localTimeCol :: QueryBuilder -> Selector LocalTime Source #
a DATETIME or a TIMESTAMP field.
timeOfDayCol :: QueryBuilder -> Selector TimeOfDay Source #
A TIME field taken as a specific time.
diffTimeCol :: QueryBuilder -> Selector DiffTime Source #
a TIME field taken as a time duration.
byteStringCol :: QueryBuilder -> Selector ByteString Source #
A binary BLOB field.
other selectors
values :: [QueryBuilder] -> Selector [MySQLValue] Source #
Read the columns directly as a MySQLValue
type without conversion.
values_ :: [QueryBuilder] -> Selector () Source #
Ignore the content of the given columns
Expressions
subQuery :: ToQueryBuilder a => a -> QueryBuilder Source #
arg :: ToSql a => a -> QueryBuilder Source #
fun :: Text -> [QueryBuilder] -> QueryBuilder Source #
op :: Text -> QueryBuilder -> QueryBuilder -> QueryBuilder Source #
(.>) :: QueryBuilder -> QueryBuilder -> QueryBuilder Source #
(.+) :: QueryBuilder -> QueryBuilder -> QueryBuilder Source #
(.-) :: QueryBuilder -> QueryBuilder -> QueryBuilder Source #
Insertion
An
provides a mapping of parts of values of type
Insertor
aa
to columns in the database. Insertors can be combined using <>
.
insertValues :: QueryBuilder -> Insertor a -> [a] -> Command Source #
insertSelect :: QueryBuilder -> [QueryBuilder] -> [QueryBuilder] -> QueryClauses -> Command Source #
into :: ToSql b => (a -> b) -> Text -> Insertor a Source #
into
uses the given extractor function to map the part to a
field. For example:
insertValues "Person" (fst `into` "name" <> snd `into` "age") [("Bart Simpson", 10), ("Lisa Simpson", 8)]
lensInto :: ToSql b => ((b -> Const b b) -> a -> Const b a) -> Text -> Insertor a Source #
lensInto
uses a lens to map the part to a field. For example:
insertValues "Person" (_1 `lensInto` "name" <> _2 `lensInto` "age") [("Bart Simpson", 10), ("Lisa Simpson", 8)]
insert2 :: (ToSql a1, ToSql a2) => Text -> Text -> Insertor (a1, a2) Source #
insert the values of a tuple
insert4 :: (ToSql a1, ToSql a2, ToSql a3, ToSql a4) => Text -> Text -> Text -> Text -> Insertor (a1, a2, a3, a4) Source #
insert5 :: (ToSql a1, ToSql a2, ToSql a3, ToSql a4, ToSql a5) => Text -> Text -> Text -> Text -> Text -> Insertor (a1, a2, a3, a4, a5) Source #
insert6 :: (ToSql a1, ToSql a2, ToSql a3, ToSql a4, ToSql a5, ToSql a6) => Text -> Text -> Text -> Text -> Text -> Text -> Insertor (a1, a2, a3, a4, a5, a6) Source #
insert7 :: (ToSql a1, ToSql a2, ToSql a3, ToSql a4, ToSql a5, ToSql a6, ToSql a7) => Text -> Text -> Text -> Text -> Text -> Text -> Text -> Insertor (a1, a2, a3, a4, a5, a6, a7) Source #
insert8 :: (ToSql a1, ToSql a2, ToSql a3, ToSql a4, ToSql a5, ToSql a6, ToSql a7, ToSql a8) => Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Insertor (a1, a2, a3, a4, a5, a6, a7, a8) Source #
insert9 :: (ToSql a1, ToSql a2, ToSql a3, ToSql a4, ToSql a5, ToSql a6, ToSql a7, ToSql a8, ToSql a9) => Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Insertor (a1, a2, a3, a4, a5, a6, a7, a8, a9) Source #
insert10 :: (ToSql a1, ToSql a2, ToSql a3, ToSql a4, ToSql a5, ToSql a6, ToSql a7, ToSql a8, ToSql a9, ToSql a10) => Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Insertor (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) Source #
toSqlValue
Instances
Rendering Queries
renderStmt :: ToQueryBuilder a => a -> ByteString Source #
renderPreparedStmt :: ToQueryBuilder a => a -> (ByteString, [MySQLValue]) Source #
data QueryBuilder Source #
Instances
IsString QueryBuilder Source # | |
Defined in Database.Hasqly fromString :: String -> QueryBuilder # | |
Semigroup QueryBuilder Source # | |
Defined in Database.Hasqly (<>) :: QueryBuilder -> QueryBuilder -> QueryBuilder # sconcat :: NonEmpty QueryBuilder -> QueryBuilder # stimes :: Integral b => b -> QueryBuilder -> QueryBuilder # | |
Monoid QueryBuilder Source # | |
Defined in Database.Hasqly mempty :: QueryBuilder # mappend :: QueryBuilder -> QueryBuilder -> QueryBuilder # mconcat :: [QueryBuilder] -> QueryBuilder # |
class ToQueryBuilder a Source #
toQueryBuilder
Instances
ToQueryBuilder Command Source # | |
Defined in Database.Hasqly | |
ToQueryBuilder (Query a) Source # | |
Defined in Database.Hasqly toQueryBuilder :: Query a -> QueryBuilder |
fromSql