SQLite上PersistList的默认值-Yesod

时间:2019-03-27 15:25:35

标签: haskell yesod persistent

我想将PersistList值添加到具有默认值的用户实体中。我的模型文件如下所示。和Models.hs文件:

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"

代码会编译,但是当向表中添加新用户时,请保存一个空数组,而不是具有默认值的数组。

  

1 | google-uid:223344555661778819911 || []

问题是如何保存默认值的列?

1 个答案:

答案 0 :(得分:0)

您读过this吗? default字段的值实际上与Haskell方面本身没有任何关系,而是通过传递它来设置DBMS的“默认值”描述。在这种情况下,[PrvDemoOne]被直接传递到SQLite,它将被解释为乱码(因为它不是有效的SQL表达式),因此可以忽略它,也可以将其视为(这里似乎是这种情况)根本没有设置默认值。

如果您想要“ Haskell方面”的默认值,则应为此创建一个函数,例如

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

如果要使用SQL默认值,则需要为要表示的值编写相应的SQL表达式。

在与Haskell不相关的注释上:SQL中表示列表(或本例中的集合)的“正常”方式是通过关系,因此您通常会有多对多的关系映射用户而不是列表字段。