2

如何使用persistLowerCasequasiquoter 构建具有两个或多个字段的唯一键?

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

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'

应用程序/模型.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
|]

应用程序/处理程序.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 平台 2013.2
  • Cabal== 1.19.2
  • persistent== 1.3.0.2
  • scotty== 0.6.2
  • esqueleto== 1.3.4.5

我错过了一些扩展或忽略了其他东西吗?

4

1 回答 1

3

据我所知,您尝试使用的数据构造函数实际上被称为GroupGroupSlugand GroupGroupName(不仅仅是GroupSlugand GroupName)。这是因为数据类型是通过获取实体名称并将其与字段名称连接起来(使用适当的大写字母)生成的。-ddump-splices尝试使用命令行参数加载源文件,您应该会在输出中的某处看到它。

于 2014-02-20T23:38:39.347 回答