2

persistLowerCasequasiquoterを使用して 2 つ以上のフィールドを持つ一意のキーを作成するにはどうすればよいですか?

Yesod bookDatabase.Persistのガイダンスを使用して単純な Web サイトのモデルを作成するために を使用すると、次のエラーが発生します。

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 プラットフォーム 2013.2
  • Cabal== 1.19.2
  • persistent== 1.3.0.2
  • scotty== 0.6.2
  • esqueleto== 1.3.4.5

拡張機能が欠落しているか、何か他のものを見落としていますか?

4

1 に答える 1

3

私の知る限り、使用しようとしているデータ コンストラクターは実際には and と呼ばれますGroupGroupSlug( andだけでGroupGroupNameはありません)。これは、エンティティ名を取得し、それをフィールド名と結合することによってデータ型が生成されるためです (適切な大文字で)。コマンドライン パラメーターを使用してソース ファイルを読み込んでみてください。出力のどこかに表示されるはずです。GroupSlugGroupName-ddump-splices

于 2014-02-20T23:38:39.347 に答える