Haskell Yesod中的复合主键

Haskell Yesod中的复合主键,haskell,yesod,template-haskell,Haskell,Yesod,Template Haskell,我是Haskell的新手,已经用yesod做了大约一周的实验。我一直在尝试连接到一个在sqlite中具有复合主键的现有数据库。我设法使代码作为一个独立的应用程序与Database.Persist.Sqlite一起工作 下面是使用persistentsqlite作为独立应用程序运行的代码 {-# LANGUAGE EmptyDataDecls #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE GADTs

我是Haskell的新手,已经用yesod做了大约一周的实验。我一直在尝试连接到一个在sqlite中具有复合主键的现有数据库。我设法使代码作为一个独立的应用程序与
Database.Persist.Sqlite一起工作

下面是使用
persistentsqlite
作为独立应用程序运行的代码

{-# LANGUAGE EmptyDataDecls             #-}
{-# LANGUAGE FlexibleContexts           #-}
{-# LANGUAGE GADTs                      #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses      #-}
{-# LANGUAGE OverloadedStrings          #-}
{-# LANGUAGE QuasiQuotes                #-}
{-# LANGUAGE TemplateHaskell            #-}
{-# LANGUAGE TypeFamilies               #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE DeriveGeneric #-}
import           Control.Monad.IO.Class  (liftIO)
import           Database.Persist
import           Database.Persist.Sqlite
import           Database.Persist.TH
import           System.Environment
import           Data.Text (Text,pack)
import           Data.Time (UTCTime)

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
    Movie
    title Text maxlen=20
    year Int maxlen=11
    genre Text Maybe maxlen=128
    mpaa Text Maybe maxlen=16
    director Text Maybe maxlen=128
    actors Text Maybe maxlen=512
    description Text Maybe maxlen=512
    path Text Maybe maxlen=128
    codec Text Maybe maxlen=32
    length Int Maybe maxlen=11
    poster Text Maybe maxlen=128
    added UTCTime default=CURRENT_TIMESTAMP
    Primary title year
    deriving Show
|]

main :: IO ()
main = do
  (path:args) <- getArgs
  movies <- runSqlite (pack path) $ do
    runMigration migrateAll
    selectList [] [Desc MovieTitle]

  mapM_ print movies
我被困在这一点上,无法继续我自己。我尝试过搜索,但我只能找到一个组合主键的工作示例,而不使用YesSOD。我觉得这应该是可能的,因为只使用
持久sqlite的复合主键可以工作

以下是如何在
config/models

Movie
    title Text maxlen=20
    year Int maxlen=11
    genre Text Maybe maxlen=128
    mpaa Text Maybe maxlen=16
    director Text Maybe maxlen=128
    actors Text Maybe maxlen=512
    description Text Maybe maxlen=512
    path Text Maybe maxlen=128
    codec Text Maybe maxlen=32
    length Int Maybe maxlen=11
    poster Text Maybe maxlen=128
    added UTCTime default=CURRENT_TIMESTAMP
    Primary title year
    deriving

我自己还没有实际使用复合主键特性,但是这个错误对我来说是有意义的。对于任意组合键,
Text
没有明显的序列化,因此persistent不会为您生成它。如果希望在URL中使用
MovieId
,则需要手动定义
PathPiece
实例,它只是一对用于在
文本之间进行转换的函数

Movie
    title Text maxlen=20
    year Int maxlen=11
    genre Text Maybe maxlen=128
    mpaa Text Maybe maxlen=16
    director Text Maybe maxlen=128
    actors Text Maybe maxlen=512
    description Text Maybe maxlen=512
    path Text Maybe maxlen=128
    codec Text Maybe maxlen=32
    length Int Maybe maxlen=11
    poster Text Maybe maxlen=128
    added UTCTime default=CURRENT_TIMESTAMP
    Primary title year
    deriving