persistent-mtl-0.1.0.1: Monad transformer for the persistent API
Safe HaskellNone
LanguageHaskell2010

Database.Persist.Monad

Description

Defines the SqlQueryT monad transformer that has a MonadSqlQuery instance to execute persistent database operations.

Usage:

myFunction :: (MonadSqlQuery m, MonadIO m) => m ()
myFunction = do
  insert_ $ Person { name = "Alice", age = Just 25 }
  insert_ $ Person { name = "Bob", age = Nothing }

  -- some other business logic

  personList <- selectList [] []
  liftIO $ print (personList :: [Person])

  -- everything in here will run in a transaction
  withTransaction $
    selectFirst [PersonAge >. 30] [] >>= \case
      Nothing -> insert_ $ Person { name = "Claire", age = Just 50 }
      Just (Entity key person) -> replace key person{ age = Just (age person - 10) }

  -- some more business logic

  return ()
Synopsis

Type class for executing database queries

class Monad m => MonadSqlQuery m Source #

The type-class for monads that can run persistent database queries.

Minimal complete definition

runQueryRep, withTransaction

Instances

Instances details
MonadSqlQuery m => MonadSqlQuery (MaybeT m) Source # 
Instance details

Defined in Database.Persist.Monad.Class

Methods

runQueryRep :: Typeable record => SqlQueryRep record a -> MaybeT m a Source #

withTransaction :: MaybeT m a -> MaybeT m a Source #

MonadUnliftIO m => MonadSqlQuery (SqlQueryT m) Source # 
Instance details

Defined in Database.Persist.Monad

Methods

runQueryRep :: Typeable record => SqlQueryRep record a -> SqlQueryT m a Source #

withTransaction :: SqlQueryT m a -> SqlQueryT m a Source #

MonadIO m => MonadSqlQuery (MockSqlQueryT m) Source # 
Instance details

Defined in Database.Persist.Monad.TestUtils

MonadSqlQuery m => MonadSqlQuery (IdentityT m) Source # 
Instance details

Defined in Database.Persist.Monad.Class

Methods

runQueryRep :: Typeable record => SqlQueryRep record a -> IdentityT m a Source #

withTransaction :: IdentityT m a -> IdentityT m a Source #

(Monoid w, MonadSqlQuery m) => MonadSqlQuery (WriterT w m) Source # 
Instance details

Defined in Database.Persist.Monad.Class

Methods

runQueryRep :: Typeable record => SqlQueryRep record a -> WriterT w m a Source #

withTransaction :: WriterT w m a -> WriterT w m a Source #

(Monoid w, MonadSqlQuery m) => MonadSqlQuery (WriterT w m) Source # 
Instance details

Defined in Database.Persist.Monad.Class

Methods

runQueryRep :: Typeable record => SqlQueryRep record a -> WriterT w m a Source #

withTransaction :: WriterT w m a -> WriterT w m a Source #

MonadSqlQuery m => MonadSqlQuery (StateT s m) Source # 
Instance details

Defined in Database.Persist.Monad.Class

Methods

runQueryRep :: Typeable record => SqlQueryRep record a -> StateT s m a Source #

withTransaction :: StateT s m a -> StateT s m a Source #

MonadSqlQuery m => MonadSqlQuery (StateT s m) Source # 
Instance details

Defined in Database.Persist.Monad.Class

Methods

runQueryRep :: Typeable record => SqlQueryRep record a -> StateT s m a Source #

withTransaction :: StateT s m a -> StateT s m a Source #

MonadSqlQuery m => MonadSqlQuery (ReaderT r m) Source # 
Instance details

Defined in Database.Persist.Monad.Class

Methods

runQueryRep :: Typeable record => SqlQueryRep record a -> ReaderT r m a Source #

withTransaction :: ReaderT r m a -> ReaderT r m a Source #

MonadSqlQuery m => MonadSqlQuery (ExceptT e m) Source # 
Instance details

Defined in Database.Persist.Monad.Class

Methods

runQueryRep :: Typeable record => SqlQueryRep record a -> ExceptT e m a Source #

withTransaction :: ExceptT e m a -> ExceptT e m a Source #

(Monoid w, MonadSqlQuery m) => MonadSqlQuery (RWST r w s m) Source # 
Instance details

Defined in Database.Persist.Monad.Class

Methods

runQueryRep :: Typeable record => SqlQueryRep record a -> RWST r w s m a Source #

withTransaction :: RWST r w s m a -> RWST r w s m a Source #

(Monoid w, MonadSqlQuery m) => MonadSqlQuery (RWST r w s m) Source # 
Instance details

Defined in Database.Persist.Monad.Class

Methods

runQueryRep :: Typeable record => SqlQueryRep record a -> RWST r w s m a Source #

withTransaction :: RWST r w s m a -> RWST r w s m a Source #

withTransaction :: MonadSqlQuery m => m a -> m a Source #

Run all queries in the given action using the same database connection.

You should make sure to not fork any threads within this action. This will almost certainly cause problems. https://github.com/brandonchinn178/persistent-mtl/issues/7

data SqlQueryRep record a where Source #

The data type containing a constructor for each persistent function we'd like to lift into MonadSqlQuery.

The record type parameter contains the PersistEntity types used in a given function.

We're using a free-monads-like technique here to allow us to introspect persistent functions in MonadSqlQuery, e.g. to mock out persistent calls in tests.

Constructors

Get :: PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record (Maybe record)

Constructor corresponding to get

GetMany :: PersistRecordBackend record SqlBackend => [Key record] -> SqlQueryRep record (Map (Key record) record)

Constructor corresponding to getMany

GetJust :: PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record record

Constructor corresponding to getJust

GetJustEntity :: PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record (Entity record)

Constructor corresponding to getJustEntity

GetEntity :: PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record (Maybe (Entity record))

Constructor corresponding to getEntity

BelongsTo :: (PersistEntity record1, PersistRecordBackend record2 SqlBackend) => (record1 -> Maybe (Key record2)) -> record1 -> SqlQueryRep (record1, record2) (Maybe record2)

Constructor corresponding to belongsTo

BelongsToJust :: (PersistEntity record1, PersistRecordBackend record2 SqlBackend) => (record1 -> Key record2) -> record1 -> SqlQueryRep (record1, record2) record2

Constructor corresponding to belongsToJust

Insert :: PersistRecordBackend record SqlBackend => record -> SqlQueryRep record (Key record)

Constructor corresponding to insert

Insert_ :: PersistRecordBackend record SqlBackend => record -> SqlQueryRep record ()

Constructor corresponding to insert_

InsertMany :: PersistRecordBackend record SqlBackend => [record] -> SqlQueryRep record [Key record]

Constructor corresponding to insertMany

InsertMany_ :: PersistRecordBackend record SqlBackend => [record] -> SqlQueryRep record ()

Constructor corresponding to insertMany_

InsertEntityMany :: PersistRecordBackend record SqlBackend => [Entity record] -> SqlQueryRep record ()

Constructor corresponding to insertEntityMany

InsertKey :: PersistRecordBackend record SqlBackend => Key record -> record -> SqlQueryRep record ()

Constructor corresponding to insertKey

Repsert :: PersistRecordBackend record SqlBackend => Key record -> record -> SqlQueryRep record ()

Constructor corresponding to repsert

RepsertMany :: PersistRecordBackend record SqlBackend => [(Key record, record)] -> SqlQueryRep record ()

Constructor corresponding to repsertMany

Replace :: PersistRecordBackend record SqlBackend => Key record -> record -> SqlQueryRep record ()

Constructor corresponding to replace

Delete :: PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record ()

Constructor corresponding to delete

Update :: PersistRecordBackend record SqlBackend => Key record -> [Update record] -> SqlQueryRep record ()

Constructor corresponding to update

UpdateGet :: PersistRecordBackend record SqlBackend => Key record -> [Update record] -> SqlQueryRep record record

Constructor corresponding to updateGet

InsertEntity :: PersistRecordBackend record SqlBackend => record -> SqlQueryRep record (Entity record)

Constructor corresponding to insertEntity

InsertRecord :: PersistRecordBackend record SqlBackend => record -> SqlQueryRep record record

Constructor corresponding to insertRecord

GetBy :: PersistRecordBackend record SqlBackend => Unique record -> SqlQueryRep record (Maybe (Entity record))

Constructor corresponding to getBy

GetByValue :: (PersistRecordBackend record SqlBackend, AtLeastOneUniqueKey record) => record -> SqlQueryRep record (Maybe (Entity record))

Constructor corresponding to getByValue

CheckUnique :: PersistRecordBackend record SqlBackend => record -> SqlQueryRep record (Maybe (Unique record))

Constructor corresponding to checkUnique

CheckUniqueUpdateable :: PersistRecordBackend record SqlBackend => Entity record -> SqlQueryRep record (Maybe (Unique record))

Constructor corresponding to checkUniqueUpdateable

DeleteBy :: PersistRecordBackend record SqlBackend => Unique record -> SqlQueryRep record ()

Constructor corresponding to deleteBy

InsertUnique :: PersistRecordBackend record SqlBackend => record -> SqlQueryRep record (Maybe (Key record))

Constructor corresponding to insertUnique

Upsert :: (PersistRecordBackend record SqlBackend, OnlyOneUniqueKey record) => record -> [Update record] -> SqlQueryRep record (Entity record)

Constructor corresponding to upsert

UpsertBy :: PersistRecordBackend record SqlBackend => Unique record -> record -> [Update record] -> SqlQueryRep record (Entity record)

Constructor corresponding to upsertBy

PutMany :: PersistRecordBackend record SqlBackend => [record] -> SqlQueryRep record ()

Constructor corresponding to putMany

InsertBy :: (PersistRecordBackend record SqlBackend, AtLeastOneUniqueKey record) => record -> SqlQueryRep record (Either (Entity record) (Key record))

Constructor corresponding to insertBy

InsertUniqueEntity :: PersistRecordBackend record SqlBackend => record -> SqlQueryRep record (Maybe (Entity record))

Constructor corresponding to insertUniqueEntity

ReplaceUnique :: (PersistRecordBackend record SqlBackend, Eq (Unique record), Eq record) => Key record -> record -> SqlQueryRep record (Maybe (Unique record))

Constructor corresponding to replaceUnique

OnlyUnique :: (PersistRecordBackend record SqlBackend, OnlyOneUniqueKey record) => record -> SqlQueryRep record (Unique record)

Constructor corresponding to onlyUnique

SelectSourceRes :: (MonadIO m2, PersistRecordBackend record SqlBackend) => [Filter record] -> [SelectOpt record] -> SqlQueryRep record (Acquire (ConduitM () (Entity record) m2 ()))

Constructor corresponding to selectSourceRes

SelectFirst :: PersistRecordBackend record SqlBackend => [Filter record] -> [SelectOpt record] -> SqlQueryRep record (Maybe (Entity record))

Constructor corresponding to selectFirst

SelectKeysRes :: (MonadIO m2, PersistRecordBackend record SqlBackend) => [Filter record] -> [SelectOpt record] -> SqlQueryRep record (Acquire (ConduitM () (Key record) m2 ()))

Constructor corresponding to selectKeysRes

Count :: PersistRecordBackend record SqlBackend => [Filter record] -> SqlQueryRep record Int

Constructor corresponding to count

Exists :: PersistRecordBackend record SqlBackend => [Filter record] -> SqlQueryRep record Bool

Constructor corresponding to exists

SelectList :: PersistRecordBackend record SqlBackend => [Filter record] -> [SelectOpt record] -> SqlQueryRep record [Entity record]

Constructor corresponding to selectList

SelectKeysList :: PersistRecordBackend record SqlBackend => [Filter record] -> [SelectOpt record] -> SqlQueryRep record [Key record]

Constructor corresponding to selectKeysList

UpdateWhere :: PersistRecordBackend record SqlBackend => [Filter record] -> [Update record] -> SqlQueryRep record ()

Constructor corresponding to updateWhere

DeleteWhere :: PersistRecordBackend record SqlBackend => [Filter record] -> SqlQueryRep record ()

Constructor corresponding to deleteWhere

DeleteWhereCount :: PersistRecordBackend record SqlBackend => [Filter record] -> SqlQueryRep record Int64

Constructor corresponding to deleteWhereCount

UpdateWhereCount :: PersistRecordBackend record SqlBackend => [Filter record] -> [Update record] -> SqlQueryRep record Int64

Constructor corresponding to updateWhereCount

DeleteCascade :: DeleteCascade record SqlBackend => Key record -> SqlQueryRep record ()

Constructor corresponding to deleteCascade

DeleteCascadeWhere :: DeleteCascade record SqlBackend => [Filter record] -> SqlQueryRep record ()

Constructor corresponding to deleteCascadeWhere

ParseMigration :: HasCallStack => Migration -> SqlQueryRep Void (Either [Text] CautiousMigration)

Constructor corresponding to parseMigration

ParseMigration' :: HasCallStack => Migration -> SqlQueryRep Void CautiousMigration

Constructor corresponding to parseMigration'

PrintMigration :: HasCallStack => Migration -> SqlQueryRep Void ()

Constructor corresponding to printMigration

ShowMigration :: HasCallStack => Migration -> SqlQueryRep Void [Text]

Constructor corresponding to showMigration

GetMigration :: HasCallStack => Migration -> SqlQueryRep Void [Sql]

Constructor corresponding to getMigration

RunMigration :: Migration -> SqlQueryRep Void ()

Constructor corresponding to runMigration

RunMigrationQuiet :: Migration -> SqlQueryRep Void [Text]

Constructor corresponding to runMigrationQuiet

RunMigrationSilent :: Migration -> SqlQueryRep Void [Text]

Constructor corresponding to runMigrationSilent

RunMigrationUnsafe :: Migration -> SqlQueryRep Void ()

Constructor corresponding to runMigrationUnsafe

RunMigrationUnsafeQuiet :: HasCallStack => Migration -> SqlQueryRep Void [Text]

Constructor corresponding to runMigrationUnsafeQuiet

GetFieldName :: PersistRecordBackend record SqlBackend => EntityField record typ -> SqlQueryRep record Text

Constructor corresponding to getFieldName

GetTableName :: PersistRecordBackend record SqlBackend => record -> SqlQueryRep record Text

Constructor corresponding to getTableName

WithRawQuery :: Text -> [PersistValue] -> ConduitM [PersistValue] Void IO a -> SqlQueryRep Void a

Constructor corresponding to withRawQuery

RawQueryRes :: MonadIO m2 => Text -> [PersistValue] -> SqlQueryRep Void (Acquire (ConduitM () [PersistValue] m2 ()))

Constructor corresponding to rawQueryRes

RawExecute :: Text -> [PersistValue] -> SqlQueryRep Void ()

Constructor corresponding to rawExecute

RawExecuteCount :: Text -> [PersistValue] -> SqlQueryRep Void Int64

Constructor corresponding to rawExecuteCount

RawSql :: RawSql a => Text -> [PersistValue] -> SqlQueryRep Void [a]

Constructor corresponding to rawSql

TransactionSave :: SqlQueryRep Void ()

Constructor corresponding to transactionSave

TransactionSaveWithIsolation :: IsolationLevel -> SqlQueryRep Void ()

Constructor corresponding to transactionSaveWithIsolation

TransactionUndo :: SqlQueryRep Void ()

Constructor corresponding to transactionUndo

TransactionUndoWithIsolation :: IsolationLevel -> SqlQueryRep Void ()

Constructor corresponding to transactionUndoWithIsolation

Instances

Instances details
Typeable record => Show (SqlQueryRep record a) Source # 
Instance details

Defined in Database.Persist.Monad.SqlQueryRep

Methods

showsPrec :: Int -> SqlQueryRep record a -> ShowS #

show :: SqlQueryRep record a -> String #

showList :: [SqlQueryRep record a] -> ShowS #

SqlQueryT monad transformer

data SqlQueryT m a Source #

The monad transformer that implements MonadSqlQuery.

Instances

Instances details
MonadTrans SqlQueryT Source # 
Instance details

Defined in Database.Persist.Monad

Methods

lift :: Monad m => m a -> SqlQueryT m a #

Monad m => Monad (SqlQueryT m) Source # 
Instance details

Defined in Database.Persist.Monad

Methods

(>>=) :: SqlQueryT m a -> (a -> SqlQueryT m b) -> SqlQueryT m b #

(>>) :: SqlQueryT m a -> SqlQueryT m b -> SqlQueryT m b #

return :: a -> SqlQueryT m a #

Functor m => Functor (SqlQueryT m) Source # 
Instance details

Defined in Database.Persist.Monad

Methods

fmap :: (a -> b) -> SqlQueryT m a -> SqlQueryT m b #

(<$) :: a -> SqlQueryT m b -> SqlQueryT m a #

Applicative m => Applicative (SqlQueryT m) Source # 
Instance details

Defined in Database.Persist.Monad

Methods

pure :: a -> SqlQueryT m a #

(<*>) :: SqlQueryT m (a -> b) -> SqlQueryT m a -> SqlQueryT m b #

liftA2 :: (a -> b -> c) -> SqlQueryT m a -> SqlQueryT m b -> SqlQueryT m c #

(*>) :: SqlQueryT m a -> SqlQueryT m b -> SqlQueryT m b #

(<*) :: SqlQueryT m a -> SqlQueryT m b -> SqlQueryT m a #

MonadIO m => MonadIO (SqlQueryT m) Source # 
Instance details

Defined in Database.Persist.Monad

Methods

liftIO :: IO a -> SqlQueryT m a #

MonadUnliftIO m => MonadUnliftIO (SqlQueryT m) Source # 
Instance details

Defined in Database.Persist.Monad

Methods

withRunInIO :: ((forall a. SqlQueryT m a -> IO a) -> IO b) -> SqlQueryT m b #

MonadResource m => MonadResource (SqlQueryT m) Source # 
Instance details

Defined in Database.Persist.Monad

Methods

liftResourceT :: ResourceT IO a -> SqlQueryT m a #

MonadUnliftIO m => MonadSqlQuery (SqlQueryT m) Source # 
Instance details

Defined in Database.Persist.Monad

Methods

runQueryRep :: Typeable record => SqlQueryRep record a -> SqlQueryT m a Source #

withTransaction :: SqlQueryT m a -> SqlQueryT m a Source #

runSqlQueryT :: Pool SqlBackend -> SqlQueryT m a -> m a Source #

Run the SqlQueryT monad transformer with the given backend.

Lifted functions