如何在Yesod中使用UUID?

时间:2016-06-12 21:43:29

标签: postgresql haskell uuid yesod yesod-forms

我使用Yesod和Postgresql构建一个简单的Web应用程序。

我希望我的一个模型使用UUID4作为主键,而不是增量整数。

我试过跟随this example,但我无法让它工作,而且它使用了镜头和棱镜,在我看来它可能过于先进而不应该是简单的东西。

那么,我如何为其ID提供UUID模型?

1 个答案:

答案 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";

来实现