2017-10-07 39 views
0

獲得持久的字段定義爲我給出一個持久模型定義喜歡這種模式

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

我正在尋找一種方式來獲得此模型的字段定義。 FieldDef看起來像一個很有前途的數據類型,但持久不會生成getPersonFields :: [FieldDef]函數,那麼它該怎麼做呢?

如果這是一個XY問題 - 這是背景: 我想在json解析錯誤的情況下返回某種元數據。如果我嘗試發佈一個新的人,但JSON是錯的,我想用一些模棱兩可的話:

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

回答

2

展示它是如何做的樣品例如:

#!/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}]