Better 'select' and 'delete' documentation.
This commit is contained in:
parent
3b995ba46f
commit
1286dc79b8
@ -359,6 +359,45 @@ selectSource = rawSelectSource SELECT
|
|||||||
|
|
||||||
-- | Execute an @esqueleto@ @SELECT@ query inside @persistent@'s
|
-- | Execute an @esqueleto@ @SELECT@ query inside @persistent@'s
|
||||||
-- 'SqlPersist' monad and return a list of rows.
|
-- 'SqlPersist' monad and return a list of rows.
|
||||||
|
--
|
||||||
|
-- We've seen that 'from' has some magic about which kinds of
|
||||||
|
-- things you may bring into scope. This 'select' function also
|
||||||
|
-- has some magic for which kinds of things you may bring back to
|
||||||
|
-- Haskell-land by using @SqlQuery@'s @return@:
|
||||||
|
--
|
||||||
|
-- * You may return a @SqlExpr ('Entity' v)@ for an entity @v@
|
||||||
|
-- (i.e., like the @*@ in SQL), which is then returned to
|
||||||
|
-- Haskell-land as just @Entity v@.
|
||||||
|
--
|
||||||
|
-- * You may return a @SqlExpr (Maybe (Entity v))@ for an entity
|
||||||
|
-- @v@ that may be @NULL@, which is then returned to
|
||||||
|
-- Haskell-land as @Maybe (Entity v)@. Used for @OUTER JOIN@s.
|
||||||
|
--
|
||||||
|
-- * You may return a @SqlExpr ('Value' t)@ for a value @t@
|
||||||
|
-- (i.e., a single column), where @t@ is any instance of
|
||||||
|
-- 'PersistField', which is then returned to Haskell-land as
|
||||||
|
-- @Value t@. You may use @Value@ to return projections of an
|
||||||
|
-- @Entity@ (see @('^.')@ and @('?.')@) or to return any other
|
||||||
|
-- value calculated on the query (e.g., 'countRows' or
|
||||||
|
-- 'sub_select').
|
||||||
|
--
|
||||||
|
-- The @SqlSelect a r@ class has functional dependencies that
|
||||||
|
-- allow type information to flow both from @a@ to @r@ and
|
||||||
|
-- vice-versa. This means that you'll almost never have to give
|
||||||
|
-- any type signatures for @esqueleto@ queries. For example, the
|
||||||
|
-- query @select $ from $ \\p -> return p@ alone is ambiguous, but
|
||||||
|
-- in the context of
|
||||||
|
--
|
||||||
|
-- @
|
||||||
|
-- do ps <- select $
|
||||||
|
-- from $ \\p ->
|
||||||
|
-- return p
|
||||||
|
-- liftIO $ mapM_ (putStrLn . personName . entityVal) ps
|
||||||
|
-- @
|
||||||
|
--
|
||||||
|
-- we are able to infer from that single @personName . entityVal@
|
||||||
|
-- function composition that the @p@ inside the query is of type
|
||||||
|
-- @SqlExpr (Entity Person)@.
|
||||||
select :: ( SqlSelect a r
|
select :: ( SqlSelect a r
|
||||||
, MonadLogger m
|
, MonadLogger m
|
||||||
, MonadResourceBase m )
|
, MonadResourceBase m )
|
||||||
@ -423,6 +462,16 @@ rawExecute mode query = do
|
|||||||
-- from $ \\appointment ->
|
-- from $ \\appointment ->
|
||||||
-- where_ (appointment ^. AppointmentDate <. val now)
|
-- where_ (appointment ^. AppointmentDate <. val now)
|
||||||
-- @
|
-- @
|
||||||
|
--
|
||||||
|
-- Unlike 'select', there is a useful way of using 'delete' that
|
||||||
|
-- will lead to type ambiguities. If you want to delete all rows
|
||||||
|
-- (i.e., no 'where_' clause), you'll have to use a type signature:
|
||||||
|
--
|
||||||
|
-- @
|
||||||
|
-- delete $
|
||||||
|
-- from $ \\(appointment :: SqlExpr (Entity Appointment)) ->
|
||||||
|
-- return ()
|
||||||
|
-- @
|
||||||
delete :: ( MonadLogger m
|
delete :: ( MonadLogger m
|
||||||
, MonadResourceBase m )
|
, MonadResourceBase m )
|
||||||
=> SqlQuery ()
|
=> SqlQuery ()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user