簡體   English   中英

如何在Yesod中使用UUID?

[英]How do I use a UUID in Yesod?

我正在使用Yesod和Postgresql構建一個簡單的Web應用程序。

我希望我的一個模型使用UUID4作為其主鍵,而不是增量整數。

我嘗試按照此示例進行操作,但無法使其正常工作,並且它使用的鏡頭和棱鏡在我看來對於某些簡單的事情來說可能太高級了。

那么,如何為模型提供ID作為其UUID?

更新 :請參閱Chris Allen關於此主題的文章

Blog模型為例:

首先,我們需要添加uuid字段和該字段的唯一性約束,以便我們知道我們的UUID將是唯一的,並且查找將很快。 我們模型中定義的字段將與我們應用形式中的字段相對應。

-- config/models

Blog
  title Text
  content Text
  user UserId
  createdAt UTCTime
  uuid Text default=uuid_generate_v4()
  UniqueUuid uuid

然后,以應用形式,導入兩個模塊,這些模塊為我們提供所需的UUID函數,並提取單值或應用樣式的值。

-- 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它太昂貴了,所以在這種情況下,我可能會使用fmap版本……但是如果我必須對UUID進行更多處理,我肯定會選擇monad版本,但是IO是Monad類型類,因此它也必須實現Functor類型類...您可以認為使用fmap更加“低級”。

nb您可能需要在數據庫中啟用uuid-ossp擴展。 您可以通過運行CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM