したがって、上記のデータはどこで宣言する必要がありますか? Foundation.hsまたはApplication.hsまたは他の場所
私はどちらの場所も定義しません。私は通常それのための新しいモジュールを作成し、そこに型を定義します。しかし、それは最終的に個人的な趣味に沸きます。 Foundation.hs
でそれを行うことはお勧めしません。これは、マスターアプリケーションの種類と、さまざまなYesod関連の型式のインスタンスが存在するモジュールだからです。同様に、アプリケーションの設定とWai Application
に関連する関数が存在するモジュールであるため、Application.hs
に追加しません。しかし、それはちょうど私の好みです。 :-)
私は、このステータスタイプとして列の1つを含むデータベーステーブルを作成します。これは私のPostgreSQLバックエンドにどのようにマッピングされていますか?どのSQLデータ型がこのステータスタイプに対応する必要がありますか?
Status
代数型をそのまま使用できます。例:
#!/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
のインスタンスを使用して変換を実行します。