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
BackendKey
yourBackendType. For The
SqlBackend 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 UserId
Now, 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.