2017-02-27 68 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实例执行转换。