2017-02-27 11 views
1

は、私は、新しいデータ型を定義したい:イェソドイェソドで新しいデータ型の定義とマッピング

data Status = Read | Reviewed | Learned 

私は足場の例を使用しています。ですから、ベストプラクティスで上記のデータをどこに宣言する必要がありますか? Foundation.hsまたはApplication.hsまたは他の場所にありますか?

このStatusタイプの列の1つを持つデータベーステーブルを作成します。 これは私のPostgreSQLバックエンドにどのようにマップされていますか?このStatusタイプに対応するSQLデータ型はどれですか?

答えて

2

したがって、上記のデータはどこで宣言する必要がありますか? 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として作成されていることがわかります。内部的にはShowReadのインスタンスを使用して変換を実行します。

関連する問題