2017-02-27 67 views
1

在耶索德,我要定義一個新的數據類型:耶索德新的數據類型定義和映射

data Status = Read | Reviewed | Learned 

我使用的支架的例子。那麼在最佳實踐中,我應該在哪裏聲明上述數據?在Foundation.hsApplication.hs或其他地方?

然後,我將創建一個數據庫表,其中一列爲Status類型。 這是如何映射到我的Postgresql後端?哪種sql數據類型應該對應這個Status類型?

回答

2

那麼在最佳實踐中,我應該在哪裏申報上述數據?在Foundation.hs或Application.hs或其他地方?

我沒有定義它的地方。我通常爲它創建一個新模塊並在其中定義類型。但最終歸結爲個人品味。我不建議它在Foundation.hs中這樣做,因爲這是一個模塊,其中您的主應用程序類型及其各種Yesod相關類型類的實例駐留在該模塊中。 Similary我不會將它添加到Application.hs,因爲這是一個模塊,您的應用程序的設置和Wai Application相關函數駐留在該模塊上。但這只是我的口味。 :-)

然後,我將創建一個數據庫表,並將其中一列作爲此狀態類型創建。這是如何映射到我的Postgresql後端?哪種sql數據類型應該與這種狀態類型相對應?

您可以使用Status algebric類型來定義它。舉個例子:

#!/usr/bin/env stack 
{- stack 
    --resolver lts-6.19 
    --install-ghc 
    runghc 
    --package persistent 
    --package aeson 
    --package persistent-postgresql 
    --package text 
    --package persistent-template 
    --package time 
    --package mtl 
-} 

{-# LANGUAGE EmptyDataDecls    #-} 
{-# LANGUAGE FlexibleContexts   #-} 
{-# LANGUAGE GADTs      #-} 
{-# LANGUAGE GeneralizedNewtypeDeriving #-} 
{-# LANGUAGE MultiParamTypeClasses  #-} 
{-# LANGUAGE OverloadedStrings   #-} 
{-# LANGUAGE QuasiQuotes    #-} 
{-# LANGUAGE TemplateHaskell   #-} 
{-# LANGUAGE FlexibleInstances#-} 
{-# LANGUAGE TypeFamilies    #-} 

import   Database.Persist 
import   Database.Persist.Postgresql 
import   Database.Persist.TH 
import   Control.Monad.IO.Class (liftIO) 
import   Control.Monad.Logger (runStderrLoggingT) 
import Data.Time 
import Data.Text 
import Data.Aeson 
import ModelSum 

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase| 
User 
    name Text 
    age Int 
    status Status 
    deriving Show 
|] 

connStr = "host=localhost dbname=test user=postgres password=postgres port=5432" 

main :: IO() 
main = mockMigration migrateAll 

而且ModelSum文件:

{-# LANGUAGE TemplateHaskell #-} 

module ModelSum where 

import Database.Persist.TH 

data Status 
    = Read 
    | Reviewed 
    | Learned 
    deriving (Show, Eq, Read) 

derivePersistField "Status" 

上執行它,你就會得到:

$ ./script.hs 
CREATe TABLE "user"("id" SERIAL8 PRIMARY KEY UNIQUE,"name" VARCHAR NOT NULL,"age" INT8 NOT NULL,"status" VARCHAR NOT NULL) 

你可以看到status列作爲 varchar創建。在內部,它使用ShowRead實例執行轉換。