我正在使用Yesod和Postgresql來構建一個簡單的Web應用程序。如何在Yesod中使用UUID?
我想我的模型之一,使用UUID4s作爲其主鍵,而不是一個增量整數。
我嘗試過以下this example,但我無法讓它工作,它使用的鏡頭和棱鏡在我看來可能會過於簡單。
那麼,如何給模型一個UUID ID?
我正在使用Yesod和Postgresql來構建一個簡單的Web應用程序。如何在Yesod中使用UUID?
我想我的模型之一,使用UUID4s作爲其主鍵,而不是一個增量整數。
我嘗試過以下this example,但我無法讓它工作,它使用的鏡頭和棱鏡在我看來可能會過於簡單。
那麼,如何給模型一個UUID ID?
更新:關於此主題,請參閱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";
來完成。