persistent-typed-db-0.1.0.7: Type safe access to multiple database schemata.
Safe HaskellNone
LanguageHaskell2010

Database.Persist.Typed

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

Instances details
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 :: forall record (m1 :: Type -> Type) (m2 :: Type -> Type). (PersistRecordBackend record (SqlFor a), MonadIO m1, MonadIO m2) => [Filter record] -> [SelectOpt record] -> ReaderT (SqlFor a) m1 (Acquire (ConduitM () (Entity record) m2 ())) #

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

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

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

exists :: forall (m :: Type -> Type) record. (MonadIO m, PersistRecordBackend record (SqlFor a)) => [Filter record] -> ReaderT (SqlFor a) m Bool #

PersistQueryWrite (SqlFor db) Source # 
Instance details

Defined in Database.Persist.Typed

Methods

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

deleteWhere :: forall (m :: Type -> Type) record. (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 :: forall record (m :: Type -> Type). (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 :: forall record (m :: Type -> Type). (MonadIO m, PersistRecordBackend record (SqlFor db)) => Unique record -> ReaderT (SqlFor db) m () #

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

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

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

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

HasPersistBackend (SqlFor a) Source # 
Instance details

Defined in Database.Persist.Typed

Associated Types

type BaseBackend (SqlFor a) #

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

PersistStoreRead (SqlFor a) Source # 
Instance details

Defined in Database.Persist.Typed

Methods

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

getMany :: forall record (m :: Type -> Type). (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 :: forall record (m :: Type -> Type). (MonadIO m, PersistRecordBackend record (SqlFor a), SafeToInsert record) => record -> ReaderT (SqlFor a) m (Key record) #

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

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

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

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

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

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

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

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

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

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

updateGet :: forall record (m :: Type -> Type). (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

data family BackendKey backend #

Instances

Instances details
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 #

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

Defined in Database.Persist.Typed

newtype BackendKey SqlReadBackend 
Instance details

Defined in Database.Persist.Sql.Orphan.PersistStore

newtype BackendKey SqlWriteBackend 
Instance details

Defined in Database.Persist.Sql.Orphan.PersistStore

newtype BackendKey SqlBackend 
Instance details

Defined in Database.Persist.Sql.Orphan.PersistStore

type Rep (BackendKey SqlReadBackend) 
Instance details

Defined in Database.Persist.Sql.Orphan.PersistStore

type Rep (BackendKey SqlReadBackend) = D1 ('MetaData "BackendKey" "Database.Persist.Sql.Orphan.PersistStore" "persistent-2.14.0.3-HEUbT28EDLPEE7sipQUuuq" 'True) (C1 ('MetaCons "SqlReadBackendKey" 'PrefixI 'True) (S1 ('MetaSel ('Just "unSqlReadBackendKey") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Int64)))
type Rep (BackendKey SqlWriteBackend) 
Instance details

Defined in Database.Persist.Sql.Orphan.PersistStore

type Rep (BackendKey SqlWriteBackend) = D1 ('MetaData "BackendKey" "Database.Persist.Sql.Orphan.PersistStore" "persistent-2.14.0.3-HEUbT28EDLPEE7sipQUuuq" 'True) (C1 ('MetaCons "SqlWriteBackendKey" 'PrefixI 'True) (S1 ('MetaSel ('Just "unSqlWriteBackendKey") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Int64)))
type Rep (BackendKey SqlBackend) 
Instance details

Defined in Database.Persist.Sql.Orphan.PersistStore

type Rep (BackendKey SqlBackend) = D1 ('MetaData "BackendKey" "Database.Persist.Sql.Orphan.PersistStore" "persistent-2.14.0.3-HEUbT28EDLPEE7sipQUuuq" 'True) (C1 ('MetaCons "SqlBackendKey" 'PrefixI 'True) (S1 ('MetaSel ('Just "unSqlBackendKey") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Int64)))
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