A specification for how the implied ID columns are created.
By default, persistent will give each table a default column named id
(customizable by PersistSettings), and the column type will be whatever
you'd expect from . For The BackendKey yourBackendTypeSqlBackend type,
this is an auto incrementing integer primary key.
You might want to give a different example. A common use case in postgresql is to use the UUID type, and automatically generate them using a SQL function.
Previously, you'd need to add a custom Id annotation for each model.
User
Id UUID default="uuid_generate_v1mc()"
name Text
Dog
Id UUID default="uuid_generate_v1mc()"
name Text
user UserIdNow, you can simply create an ImplicitIdDef that corresponds to this declaration.
newtype UUID = UUID ByteString
instance PersistField UUID where
toPersistValue (UUID bs) =
PersistLiteral_ Escaped bs
fromPersistValue pv =
case pv of
PersistLiteral_ Escaped bs ->
Right (UUID bs)
_ ->
Left "nope"
instance PersistFieldSql UUID where
sqlType _ = SqlOther UUID
With this instance at the ready, we can now create our implicit definition:
uuidDef :: ImplicitIdDef
uuidDef = mkImplicitIdDef @UUID "uuid_generate_v1mc()"
And we can use setImplicitIdDef to use this with the MkPersistSettings
for our block.
mkPersist (setImplicitIdDef uuidDef sqlSettings) [persistLowerCase| ... |]
TODO: either explain interaction with mkMigrate or fix it. see issue #1249 for more details.
Constructors
ImplicitIdDefiidFieldType :: EntityNameHS -> FieldTypeThe field type. Accepts the EntityNameHS if you want to refer to it. By default,
Idis appended to the end of the Haskell name.iidFieldSqlType :: SqlTypeiidType :: Bool -> Type -> TypeThe Bool argument is whether or not the
MkPersistBackendtype has thempsGenericfield set.The Type is the
mpsBackendvalue.The default uses
(or a generic equivalent).BackendKeySqlBackendiidDefault :: Maybe TextThe default expression for the field. Note that setting this to Nothing is unsafe. see https://github.com/yesodweb/persistent/issues/1247 for more information.
With some cases - like the Postgresql
SERIALtype - this is safe, since there's an implied default.iidMaxLen :: Maybe IntegerSpecify the maximum length for a key column. This is necessary for
VARCHARcolumns, likeUUIDin MySQL. MySQL will throw a runtime error if a text or binary column is used in an index without a length specification.