Safe Haskell | None |
---|
Database.Persist.TH
Description
This module provides utilities for creating backends. Regular users do not need to use this module.
- persistWith :: PersistSettings -> QuasiQuoter
- persistUpperCase :: QuasiQuoter
- persistLowerCase :: QuasiQuoter
- persistFileWith :: PersistSettings -> FilePath -> Q Exp
- mkPersist :: MkPersistSettings -> [EntityDef SqlType] -> Q [Dec]
- data MkPersistSettings
- mpsBackend :: MkPersistSettings -> Type
- mpsGeneric :: MkPersistSettings -> Bool
- mpsPrefixFields :: MkPersistSettings -> Bool
- mpsEntityJSON :: MkPersistSettings -> Maybe EntityJSON
- mpsGenerateLenses :: MkPersistSettings -> Bool
- data EntityJSON = EntityJSON {}
- mkPersistSettings :: Type -> MkPersistSettings
- sqlSettings :: MkPersistSettings
- sqlOnlySettings :: MkPersistSettings
- mkMigrate :: Lift' a => String -> [EntityDef a] -> Q [Dec]
- mkSave :: String -> [EntityDef SqlType] -> Q [Dec]
- mkDeleteCascade :: MkPersistSettings -> [EntityDef a] -> Q [Dec]
- share :: [[EntityDef a] -> Q [Dec]] -> [EntityDef a] -> Q [Dec]
- derivePersistField :: String -> Q [Dec]
- derivePersistFieldJSON :: String -> Q [Dec]
- persistFieldFromEntity :: MkPersistSettings -> EntityDef a -> Q [Dec]
- packPTH :: String -> Text
- lensPTH :: (s -> a) -> (s -> b -> t) -> Lens s t a b
Parse entity defs
persistWith :: PersistSettings -> QuasiQuoterSource
Converts a quasi-quoted syntax into a list of entity definitions, to be used as input to the template haskell generation code (mkPersist).
persistFileWith :: PersistSettings -> FilePath -> Q ExpSource
Same as persistWith
, but uses an external file instead of a
quasiquotation.
Turn EntityDef
s into types
mkPersist :: MkPersistSettings -> [EntityDef SqlType] -> Q [Dec]Source
Create data types and appropriate PersistEntity
instances for the given
EntityDef
s. Works well with the persist quasi-quoter.
data MkPersistSettings Source
Settings to be passed to the mkPersist
function.
mpsBackend :: MkPersistSettings -> TypeSource
Which database backend we're using.
When generating data types, each type is given a generic version- which works with any backend- and a type synonym for the commonly used backend. This is where you specify that commonly used backend.
mpsGeneric :: MkPersistSettings -> BoolSource
Create generic types that can be used with multiple backends. Good for reusable code, but makes error messages harder to understand. Default: True.
mpsPrefixFields :: MkPersistSettings -> BoolSource
Prefix field names with the model name. Default: True.
mpsEntityJSON :: MkPersistSettings -> Maybe EntityJSONSource
Generate ToJSON
/FromJSON
instances for each model types. If it's
Nothing
, no instances will be generated. Default:
Just EntityJSON { entityToJSON = 'keyValueEntityToJSON , entityFromJSON = 'keyValueEntityFromJSON }
mpsGenerateLenses :: MkPersistSettings -> BoolSource
Instead of generating normal field accessors, generator lens-style accessors.
Default: False
Since 1.3.1
data EntityJSON Source
Constructors
EntityJSON | |
Fields
|
Arguments
:: Type | Value for |
-> MkPersistSettings |
Create an MkPersistSettings
with default values.
sqlSettings :: MkPersistSettingsSource
Use the SqlPersist
backend.
sqlOnlySettings :: MkPersistSettingsSource
Same as sqlSettings
, but set mpsGeneric
to False
.
Since 1.1.1
Various other TH functions
mkMigrate :: Lift' a => String -> [EntityDef a] -> Q [Dec]Source
Creates a single function to perform all migrations for the entities defined here. One thing to be aware of is dependencies: if you have entities with foreign references, make sure to place those definitions after the entities they reference.
mkSave :: String -> [EntityDef SqlType] -> Q [Dec]Source
Save the EntityDef
s passed in under the given name.
mkDeleteCascade :: MkPersistSettings -> [EntityDef a] -> Q [Dec]Source
Generate a DeleteCascade
instance for the given EntityDef
s.
share :: [[EntityDef a] -> Q [Dec]] -> [EntityDef a] -> Q [Dec]Source
Apply the given list of functions to the same EntityDef
s.
This function is useful for cases such as:
>>>
share [mkSave "myDefs", mkPersist sqlSettings] [persistLowerCase|...|]
derivePersistField :: String -> Q [Dec]Source
Automatically creates a valid PersistField
instance for any datatype
that has valid Show
and Read
instances. Can be very convenient for
Enum
types.
derivePersistFieldJSON :: String -> Q [Dec]Source
Automatically creates a valid PersistField
instance for any datatype
that has valid ToJSON
and FromJSON
instances. For a datatype T
it
generates instances similar to these:
instance PersistField T where toPersistValue = PersistByteString . L.toStrict . encode fromPersistValue = (left T.pack) . eitherDecodeStrict' <=< fromPersistValue instance PersistFieldSql T where sqlType _ = SqlString
persistFieldFromEntity :: MkPersistSettings -> EntityDef a -> Q [Dec]Source
produce code similar to the following:
instance PersistEntity e => PersistField e where toPersistValue = PersistMap $ zip columNames (map toPersistValue . toPersistFields) fromPersistValue (PersistMap o) = let columns = HM.fromList o in fromPersistValues $ map (name -> case HM.lookup name columns of Just v -> v Nothing -> PersistNull fromPersistValue x = Left $ Expected PersistMap, received: ++ show x sqlType _ = SqlString