在耶索德,我要定义一个新的数据类型:耶索德新的数据类型定义和映射
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
实例执行转换。