我使用Yesod和Postgresql构建一个简单的Web应用程序。
我希望我的一个模型使用UUID4作为主键,而不是增量整数。
我试过跟随this example,但我无法让它工作,而且它使用了镜头和棱镜,在我看来它可能过于先进而不应该是简单的东西。
那么,我如何为其ID提供UUID模型?
答案 0 :(得分:2)
更新:请参阅Chris Allen关于此主题的article。
以Blog
模型为例:
首先,我们需要在该字段上添加uuid
字段和唯一性约束,以便我们知道我们的UUID将是唯一的,并且查找速度很快。我们模型中定义的字段将与我们的应用形式中的字段相对应。
-- config/models
Blog
title Text
content Text
user UserId
createdAt UTCTime
uuid Text default=uuid_generate_v4()
UniqueUuid uuid
然后在我们的应用形式中,我们导入两个模块,它们为我们提供了我们需要的UUID函数,并以monadic或applicative方式提取值。
-- Handler/Home.hs
import Data.UUID
import Data.UUID.V4
form :: UserId -> Form Blog
form userId = renderDivs $ Blog
<$> areq textField "Title" Nothing
<*> areq textareaField "Contents" Nothing
<*> pure userId
<*> lift (liftIO getCurrentTime)
-- either use the following line (monadic style)
<*> lift (liftIO $ do { key <- nextRandom; return $ toText key })
-- ...or use this style (applicative style)
<*> lift (fmap toText $ liftIO nextRandom)
我在一个IRC频道问了一个有用的Haskeller这两种方法之间的区别是什么,这是他们的答复:
不知怎的,我个人更喜欢monad版本...但它在语法上太贵了,所以在这种情况下我可能会使用
fmap
版本......但如果我需要对UUID进行更多处理,我肯定会去monad版本,但IO是Monad类型,所以它必须实现Functor类型类...你可以认为使用fmap
更“低级”
n.b。您可能需要在数据库中启用uuid-ossp
扩展名。您可以通过运行CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
。