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