如何使用quasiquoter为Database.Persist模型添加唯一键?

时间:2014-02-20 18:49:14

标签: haskell yesod esqueleto

如何使用persistLowerCase quasiquoter构建包含两个或多个字段的唯一键?

使用Database.Persist使用Yesod book的指导为简单网站创建模型时,会出现以下错误:

Build FAILED
$PREFIX/App/Models.hs: line 42, column 18:
  Not in scope: data constructor `GroupSlug'
$PREFIX/App/Models.hs: line 43, column 19:
  Not in scope: data constructor `GroupName'

应用/ Models.hs

{-# LANGUAGE EmptyDataDecls       #-}
{-# LANGUAGE FlexibleContexts     #-}
{-# LANGUAGE FlexibleInstances    #-}
{-# LANGUAGE GADTs                #-}
{-# LANGUAGE OverloadedStrings    #-}
{-# LANGUAGE QuasiQuotes          #-}
{-# LANGUAGE TemplateHaskell      #-}
{-# LANGUAGE TypeFamilies         #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module App.Models where

import           Data.Text                    (Text)
import           Database.Persist.TH

share [ mkPersist sqlSettings
      , mkMigrate "migrateAll"] [persistLowerCase|
Post
    group          GroupId
    postName       Text
    postSlug       Text
    period         Text
    content_en     Text
    content_pt     Text
    UniquePost     postSlug
    deriving Show
Group
    groupId      Int
    groupName    Text
    groupSlug    Text
    parent       GroupId
    UniqueGroup  groupId groupSlug
    deriving Show
|]

应用/ Handlers.hs

{-# LANGUAGE OverloadedStrings #-}
module App.Handlers where

import           Database.Esqueleto
import           App.Models

groupQuery x =
    select $
    from $ \g -> do
    where_ (g ^. GroupSlug ==. val x)
    return $ g ^. GroupName

版本:

  • Haskell Platform 2013.2
  • Cabal == 1.19.2
  • persistent == 1.3.0.2
  • scotty == 0.6.2
  • esqueleto == 1.3.4.5

我错过了某些扩展或忽略了其他内容吗?

1 个答案:

答案 0 :(得分:3)

据我所知,您尝试使用的数据构造函数实际上称为GroupGroupSlugGroupGroupName(不只是GroupSlugGroupName)。这是因为数据类型是通过获取实体名称并将其与字段名称(具有适当的大小写)连接而生成的。尝试使用-ddump-splices命令行参数加载源文件,您应该在输出的某处看到它。