Йесод новое определение типа данных и отображение

голоса
1

В Йесод, я хочу, чтобы определить новый тип данных:

data Status = Read | Reviewed | Learned

Я использую пример эшафот. Таким образом , в наилучшей практике , где я должен объявить вышеуказанные данные? В Foundation.hsOR Application.hsили в другом месте?

Затем я создать таблицу базы данных с одного столбца , как этот Statusтип. Как это отображается в моем Postgresql бэкэндом? Какой тип данных SQL должны соответствовать этому Statusтипу?

Задан 27/02/2017 в 13:00
источник пользователем
На других языках...                            


1 ответов

голоса
2

Таким образом, в наилучшей практике, где я должен объявить вышеуказанные данные? В Foundation.hs или Application.hs или в другом месте?

Я определяю это ни места. Я обычно создаю новый модуль для него и определить тип там. Но в конечном счете , сводится к личному вкусу. Я не рекомендую делать это в , Foundation.hsпотому что это модуль , где ваш мастер тип приложения и это экземпляры различных связанных Йесод классов типов находятся на. Similary я бы не добавить его в Application.hsпотому , что это модуль , где установка вашего приложения и Wai Applicationфункции , связанные находятся на. Но это только мой вкус. :-)

Затем я создать таблицу базы данных с одного столбца, поскольку этот тип состояния. Как это отображается в моем Postgresql бэкэндом? Какой тип данных SQL должно соответствовать этому типу состояния?

Вы можете использовать Statusalgebric тип будет определять , как это. Пример:

#!/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экземпляров.

Ответил 27/02/2017 в 15:35
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more