Hoogle Search

Within LTS Haskell 22.13 (ghc-9.6.4)

Note that Stackage only displays results for the latest LTS and Nightly snapshot. Learn more.

  1. class PersistField a

    persistent Database.Persist.Class

    This class teaches Persistent how to take a custom type and marshal it to and from a PersistValue, allowing it to be stored in a database.

    Examples

    Simple Newtype
    You can use newtype to add more type safety/readability to a basis type like ByteString. In these cases, just derive PersistField and PersistFieldSql:
    {-# LANGUAGE GeneralizedNewtypeDeriving #-}
    
    newtype HashedPassword = HashedPassword ByteString
    deriving (Eq, Show, PersistField, PersistFieldSql)
    
    Smart Constructor Newtype
    In this example, we create a PersistField instance for a newtype following the "Smart Constructor" pattern.
    {-# LANGUAGE GeneralizedNewtypeDeriving #-}
    import qualified Data.Text as T
    import qualified Data.Char as C
    
    -- | An American Social Security Number
    newtype SSN = SSN ErrorMessage
    deriving (Eq, Show, PersistFieldSql)
    
    mkSSN :: ErrorMessage -> Either ErrorMessage SSN
    mkSSN t = if (T.length t == 9) && (T.all C.isDigit t)
    then Right $ SSN t
    else Left $ "Invalid SSN: " <> t
    
    instance PersistField SSN where
    toPersistValue (SSN t) = PersistText t
    fromPersistValue (PersistText t) = mkSSN t
    -- Handle cases where the database does not give us PersistText
    fromPersistValue x = Left $ "File.hs: When trying to deserialize an SSN: expected PersistText, received: " <> T.pack (show x)
    
    Tips:
    • This file contain dozens of PersistField instances you can look at for examples.
    • Typically custom PersistField instances will only accept a single PersistValue constructor in fromPersistValue.
    • Internal PersistField instances accept a wide variety of PersistValues to accomodate e.g. storing booleans as integers, booleans or strings.
    • If you're making a custom instance and using a SQL database, you'll also need PersistFieldSql to specify the type of the database column.

Page 1 of 1