Search code examples
haskellyesodpersistent

default values for PersistList on SQLite - Yesod


I would like to add a PersistList value into a user entity with a default value. My model file looks like this. And Models.hs file:

User
    ident Text
    password Text Maybe
    UniqueUser ident
    perms [Privileges] default=[PrvDemoOne]
    deriving Typeable

data Privileges =
  PrvDemoOne         -- ^ what can be demo one...
  | PrvDemoTwo       -- ^ what can be demo two...
  deriving (Show,Read,Eq)

derivePersistField "Privileges"

the code compiles but when a new user is added into the table save an empty array instead of an array with the default value.

1|google-uid:223344555661778819911||[]

The question is how I could save the column with the default value?


Solution

  • Have you read this? The value of the default field doesn't really have anything to do with the Haskell side per-se, it's being passed to set the "default value" description your DBMS. In this case [PrvDemoOne] is being passed directly to SQLite, which will interpret it as gibberish (because it's not a valid SQL expression) so this is either ignored or (what seems to be the case here) treated as if you hadn't set a default at all.

    If you want a "Haskell side" default value you should just create a function for that, i.e. something like

    defaultUser :: Text -> Maybe Text -> User
    defaultUser i maybePw = User { ident = i, password = maybePw, perms = [PrvDemoOne] }
    

    If you want a SQL side default you need to write the corresponding SQL expression for the value you're trying to represent.

    On a non-Haskell related note: the 'normal' way to represent lists (or sets in this case, rather!) in SQL is via relations, so you'd normally have a many-to-many relationship mapping users to their privileges instead of a list field.