2017-10-07 12 views
0

에 대한의 지속 필드 정의를 얻을 :이 모델에 대한 필드 정의를 얻을 수있는 방법을 찾고 있어요은 다음과 같이 영구적 인 모델 정의를 주어 내 모델

mkPersist sqlSettings [persistLowerCase| 
Person 
    name String 
    age Int 
    deriving Show 
|] 

. FieldDef은 유망한 데이터 유형처럼 보이지만 영구적으로 getPersonFields :: [FieldDef] 함수를 생성하지 않으므로 어떻게 수행 할 수 있습니까?

이것이 XY 문제인 경우 - 배경은 다음과 같습니다. json 구문 분석 오류의 경우 메타 데이터를 반환하고 싶습니다.

{ 
    "result": "error", 
    "code": 8, 
    "message": "Could not parse payload as person", 
    "fields": [ 
     { 
      "name": "name", 
      "type": "string" 
     }, 
     { 
      "name": "age", 
      "type": "int" 
     } 
    ] 
} 

답변

2

가 수행하는 방법을 보여주는 샘플 예 : 나는 새로운 사람을 게시하려고하지만 JSON이 잘못되면, 내가 좋아하는 무언가로 응답 할

#!/usr/bin/env stack 
{- stack 
    --resolver lts-9.0 
    --install-ghc 
    runghc 
    --package persistent 
    --package persistent-sqlite 
    --package persistent-template 
-} 

{-# LANGUAGE EmptyDataDecls    #-} 
{-# LANGUAGE FlexibleContexts   #-} 
{-# LANGUAGE GADTs      #-} 
{-# LANGUAGE GeneralizedNewtypeDeriving #-} 
{-# LANGUAGE MultiParamTypeClasses  #-} 
{-# LANGUAGE OverloadedStrings   #-} 
{-# LANGUAGE QuasiQuotes    #-} 
{-# LANGUAGE TemplateHaskell   #-} 
{-# LANGUAGE TypeFamilies    #-} 
import   Control.Monad.IO.Class (liftIO) 
import   Database.Persist 
import   Database.Persist.Sqlite 
import   Database.Persist.TH 

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase| 
Person 
    name String 
    age Int Maybe 
    deriving Show 
BlogPost 
    title String 
    authorId PersonId 
    deriving Show 
|] 

main :: IO() 
main = let efields = entityFields $ entityDef (undefined :: Maybe Person) 
     in print efields 

데모 :

$ stack efield.hs 
[FieldDef {fieldHaskell = HaskellName {unHaskellName = "name"}, fieldDB = DBName {unDBName = "name"}, fieldType = FTTypeCon Nothing "String", fieldSqlType = SqlString, fieldAttrs = [], fieldStrict = True, fieldReference = NoReference},FieldDef {fieldHaskell = HaskellName {unHaskellName = "age"}, fieldDB = DBName {unDBName = "age"}, fieldType = FTTypeCon Nothing "Int", fieldSqlType = SqlInt64, fieldAttrs = ["Maybe"], fieldStrict = True, fieldReference = NoReference}]