persistent-typed-db-0.1.0.1: Type safe access to multiple database schemata.

Safe HaskellNone
LanguageHaskell2010

Database.Persist.Typed

Contents

Description

This module defines types and helpers for type-safe access to multiple database schema.

Synopsis

Schema Definition

mkSqlSettingsFor :: Name -> MkPersistSettings Source #

Use the SqlFor type for the database connection backend. Use this instead of sqlSettings and provide a quoted type name.

data MainDb

share [ mkPersist (mkSqlSettingsFor ''MainDb), mkMigrate "migrateAll" ] [persistLowerCase|

User
    name Text
    age  Int

    deriving Show Eq
|]

The entities generated will have the PersistEntityBackend defined to be SqlFor MainDb instead of SqlBackend. This is what provides the type safety.

Since: 0.0.1.0

newtype SqlFor db Source #

A wrapper around SqlBackend type. To specialize this to a specific database, fill in the type parameter.

Since: 0.0.1.0

Constructors

SqlFor 

Fields

Instances
BackendCompatible SqlBackend (SqlFor db) Source # 
Instance details

Defined in Database.Persist.Typed

Bounded (BackendKey (SqlFor a)) Source # 
Instance details

Defined in Database.Persist.Typed

Enum (BackendKey (SqlFor a)) Source # 
Instance details

Defined in Database.Persist.Typed

Eq (BackendKey (SqlFor a)) Source # 
Instance details

Defined in Database.Persist.Typed

Integral (BackendKey (SqlFor a)) Source # 
Instance details

Defined in Database.Persist.Typed

Num (BackendKey (SqlFor a)) Source # 
Instance details

Defined in Database.Persist.Typed

Ord (BackendKey (SqlFor a)) Source # 
Instance details

Defined in Database.Persist.Typed

Read (BackendKey (SqlFor a)) Source # 
Instance details

Defined in Database.Persist.Typed

Real (BackendKey (SqlFor a)) Source # 
Instance details

Defined in Database.Persist.Typed

Show (BackendKey (SqlFor a)) Source # 
Instance details

Defined in Database.Persist.Typed

ToJSON (BackendKey (SqlFor a)) Source # 
Instance details

Defined in Database.Persist.Typed

FromJSON (BackendKey (SqlFor a)) Source # 
Instance details

Defined in Database.Persist.Typed

ToHttpApiData (BackendKey (SqlFor a)) Source # 
Instance details

Defined in Database.Persist.Typed

FromHttpApiData (BackendKey (SqlFor a)) Source # 
Instance details

Defined in Database.Persist.Typed

PathPiece (BackendKey (SqlFor a)) Source # 
Instance details

Defined in Database.Persist.Typed

PersistFieldSql (BackendKey (SqlFor a)) Source # 
Instance details

Defined in Database.Persist.Typed

Methods

sqlType :: Proxy (BackendKey (SqlFor a)) -> SqlType #

PersistQueryRead (SqlFor a) Source # 
Instance details

Defined in Database.Persist.Typed

Methods

selectSourceRes :: (PersistRecordBackend record (SqlFor a), MonadIO m1, MonadIO m2) => [Filter record] -> [SelectOpt record] -> ReaderT (SqlFor a) m1 (Acquire (ConduitM () (Entity record) m2 ())) #

selectFirst :: (MonadIO m, PersistRecordBackend record (SqlFor a)) => [Filter record] -> [SelectOpt record] -> ReaderT (SqlFor a) m (Maybe (Entity record)) #

selectKeysRes :: (MonadIO m1, MonadIO m2, PersistRecordBackend record (SqlFor a)) => [Filter record] -> [SelectOpt record] -> ReaderT (SqlFor a) m1 (Acquire (ConduitM () (Key record) m2 ())) #

count :: (MonadIO m, PersistRecordBackend record (SqlFor a)) => [Filter record] -> ReaderT (SqlFor a) m Int #

PersistQueryWrite (SqlFor db) Source # 
Instance details

Defined in Database.Persist.Typed

Methods

updateWhere :: (MonadIO m, PersistRecordBackend record (SqlFor db)) => [Filter record] -> [Update record] -> ReaderT (SqlFor db) m () #

deleteWhere :: (MonadIO m, PersistRecordBackend record (SqlFor db)) => [Filter record] -> ReaderT (SqlFor db) m () #

PersistUniqueRead (SqlFor a) Source # 
Instance details

Defined in Database.Persist.Typed

Methods

getBy :: (MonadIO m, PersistRecordBackend record (SqlFor a)) => Unique record -> ReaderT (SqlFor a) m (Maybe (Entity record)) #

PersistUniqueWrite (SqlFor db) Source # 
Instance details

Defined in Database.Persist.Typed

Methods

deleteBy :: (MonadIO m, PersistRecordBackend record (SqlFor db)) => Unique record -> ReaderT (SqlFor db) m () #

insertUnique :: (MonadIO m, PersistRecordBackend record (SqlFor db)) => record -> ReaderT (SqlFor db) m (Maybe (Key record)) #

upsert :: (MonadIO m, PersistRecordBackend record (SqlFor db), OnlyOneUniqueKey record) => record -> [Update record] -> ReaderT (SqlFor db) m (Entity record) #

upsertBy :: (MonadIO m, PersistRecordBackend record (SqlFor db)) => Unique record -> record -> [Update record] -> ReaderT (SqlFor db) m (Entity record) #

putMany :: (MonadIO m, PersistRecordBackend record (SqlFor db)) => [record] -> ReaderT (SqlFor db) m () #

HasPersistBackend (SqlFor a) Source # 
Instance details

Defined in Database.Persist.Typed

Associated Types

type BaseBackend (SqlFor a) :: Type #

IsPersistBackend (SqlFor a) Source # 
Instance details

Defined in Database.Persist.Typed

PersistCore (SqlFor a) Source # 
Instance details

Defined in Database.Persist.Typed

Associated Types

data BackendKey (SqlFor a) :: Type #

PersistStoreRead (SqlFor a) Source # 
Instance details

Defined in Database.Persist.Typed

Methods

get :: (MonadIO m, PersistRecordBackend record (SqlFor a)) => Key record -> ReaderT (SqlFor a) m (Maybe record) #

getMany :: (MonadIO m, PersistRecordBackend record (SqlFor a)) => [Key record] -> ReaderT (SqlFor a) m (Map (Key record) record) #

PersistStoreWrite (SqlFor a) Source # 
Instance details

Defined in Database.Persist.Typed

Methods

insert :: (MonadIO m, PersistRecordBackend record (SqlFor a)) => record -> ReaderT (SqlFor a) m (Key record) #

insert_ :: (MonadIO m, PersistRecordBackend record (SqlFor a)) => record -> ReaderT (SqlFor a) m () #

insertMany :: (MonadIO m, PersistRecordBackend record (SqlFor a)) => [record] -> ReaderT (SqlFor a) m [Key record] #

insertMany_ :: (MonadIO m, PersistRecordBackend record (SqlFor a)) => [record] -> ReaderT (SqlFor a) m () #

insertEntityMany :: (MonadIO m, PersistRecordBackend record (SqlFor a)) => [Entity record] -> ReaderT (SqlFor a) m () #

insertKey :: (MonadIO m, PersistRecordBackend record (SqlFor a)) => Key record -> record -> ReaderT (SqlFor a) m () #

repsert :: (MonadIO m, PersistRecordBackend record (SqlFor a)) => Key record -> record -> ReaderT (SqlFor a) m () #

repsertMany :: (MonadIO m, PersistRecordBackend record (SqlFor a)) => [(Key record, record)] -> ReaderT (SqlFor a) m () #

replace :: (MonadIO m, PersistRecordBackend record (SqlFor a)) => Key record -> record -> ReaderT (SqlFor a) m () #

delete :: (MonadIO m, PersistRecordBackend record (SqlFor a)) => Key record -> ReaderT (SqlFor a) m () #

update :: (MonadIO m, PersistRecordBackend record (SqlFor a)) => Key record -> [Update record] -> ReaderT (SqlFor a) m () #

updateGet :: (MonadIO m, PersistRecordBackend record (SqlFor a)) => Key record -> [Update record] -> ReaderT (SqlFor a) m record #

PersistField (BackendKey (SqlFor a)) Source # 
Instance details

Defined in Database.Persist.Typed

type BaseBackend (SqlFor a) Source # 
Instance details

Defined in Database.Persist.Typed

newtype BackendKey (SqlFor a) Source # 
Instance details

Defined in Database.Persist.Typed

Specialized aliases

type SqlPersistTFor db = ReaderT (SqlFor db) Source #

This type signature represents a database query for a specific database. You will likely want to specialize this to your own application for readability:

data MainDb

type MainQueryT = SqlPersistTFor MainDb

getStuff :: MonadIO m => StuffId -> MainQueryT m (Maybe Stuff)

Since: 0.0.1.0

type ConnectionPoolFor db = Pool (SqlFor db) Source #

A Pool of database connections that are specialized to a specific database.

Since: 0.0.1.0

type SqlPersistMFor db = ReaderT (SqlFor db) (NoLoggingT (ResourceT IO)) Source #

A specialization of SqlPersistM that uses the underlying db database type.

Since: 0.0.1.0

Running specialized queries

runSqlPoolFor :: MonadUnliftIO m => SqlPersistTFor db m a -> ConnectionPoolFor db -> m a Source #

Run a SqlPersistTFor action on an appropriate database.

Since: 0.0.1.0

runSqlConnFor :: MonadUnliftIO m => SqlPersistTFor db m a -> SqlFor db -> m a Source #

Run a SqlPersistTFor action on the appropriate database connection.

Since: 0.0.1.0

Specializing and generalizing

generalizePool :: ConnectionPoolFor db -> ConnectionPool Source #

Generalize a Pool (SqlFor db) to an ordinary ConnectionPool. This renders the pool unusable for model-specific code that relies on the type safety, but allows you to use it for general-purpose SQL queries.

Since: 0.0.1.0

specializePool :: ConnectionPool -> ConnectionPoolFor db Source #

Specialize a ConnectionPool to a Pool (SqlFor db). You should apply this whenever you create or initialize the database connection pooling to avoid potentially mixing the database pools up.

Since: 0.0.1.0

generalizeQuery :: forall db m a. SqlPersistTFor db m a -> SqlPersistT m a Source #

Generalizes a query from a specific database to one that is database agnostic.

Since: 0.0.1.0

specializeQuery :: forall db m a. SqlPersistT m a -> SqlPersistTFor db m a Source #

Specialize a query to a specific database. You should define aliases for this function for each database you use.

data MainDb

data AccountDb

mainQuery :: ReaderT SqlBackend m a -> ReaderT (SqlFor MainDb) m a
mainQuery = specializeQuery

accountQuery :: ReaderT SqlBackend m a -> ReaderT (SqlFor AccountDb) m a
accountQuery = specializeQuery

Since: 0.0.1.0

generalizeSqlBackend :: SqlFor db -> SqlBackend Source #

Generalizes a SqlFor backend to be database agnostic.

Since: 0.0.1.0

specializeSqlBackend :: SqlBackend -> SqlFor db Source #

Specializes a SqlBackend for a specific database.

Since: 0.0.1.0

Key functions

toSqlKeyFor :: ToBackendKey (SqlFor a) record => Int64 -> Key record Source #

Persistent's toSqlKey and fromSqlKey hardcode the SqlBackend, so we have to reimplement them here.

Since: 0.0.1.0

fromSqlKeyFor :: ToBackendKey (SqlFor a) record => Key record -> Int64 Source #

Persistent's toSqlKey and fromSqlKey hardcode the SqlBackend, so we have to reimplement them here.

Since: 0.0.1.0