2016-06-12 63 views
1

我正在使用Yesod和Postgresql來構建一個簡單的Web應用程序。如何在Yesod中使用UUID?

我想我的模型之一,使用UUID4s作爲其主鍵,而不是一個增量整數。

我嘗試過以下this example,但我無法讓它工作,它使用的鏡頭和棱鏡在我看來可能會過於簡單。

那麼,如何給模型一個UUID ID?

回答

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功能,並且在任何一個一元或合用的風格中提取的值。

-- 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) 

我問了一個有用的Haskeller IRC頻道什麼的兩種方法之間的差異,這是他們的答覆:

不知怎的,我個人比較喜歡的單子版本更多...但它在語法上是太昂貴了,所以在這種情況下,我可能會去與fmap版本......但如果我將不得不在UUID上做更多的處理,我肯定會去monad版本,但IO是Monad類型的類,所以它也必須實現Functor type class ...你可以認爲使用fmap更「低級」

n.b.您可能需要在數據庫中啓用uuid-ossp擴展。你可以通過運行CREATE EXTENSION IF NOT EXISTS "uuid-ossp";來完成。