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.