在耶索德,我要定義一個新的數據類型:耶索德新的數據類型定義和映射
data Status = Read | Reviewed | Learned
我使用的支架的例子。那麼在最佳實踐中,我應該在哪裏聲明上述數據?在Foundation.hs
或Application.hs
或其他地方?
然後,我將創建一個數據庫表,其中一列爲Status
類型。 這是如何映射到我的Postgresql後端?哪種sql數據類型應該對應這個Status
類型?
在耶索德,我要定義一個新的數據類型:耶索德新的數據類型定義和映射
data Status = Read | Reviewed | Learned
我使用的支架的例子。那麼在最佳實踐中,我應該在哪裏聲明上述數據?在Foundation.hs
或Application.hs
或其他地方?
然後,我將創建一個數據庫表,其中一列爲Status
類型。 這是如何映射到我的Postgresql後端?哪種sql數據類型應該對應這個Status
類型?
那麼在最佳實踐中,我應該在哪裏申報上述數據?在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
創建。在內部,它使用Show
和 Read
實例執行轉換。