我有这个SQLite persitent架构:
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Entry
class EntryClass
|]
这映射到以下CREATE TABLE
语句:
CREATE TABLE "entry"
( "id" INTEGER PRIMARY KEY AUTOINCREMENT
, "class" INTEGER NOT NULL);"
我手动添加了AUTOINCREMENT
关键字,以确保标识符始终单调递增。现在我想从数据库中选择最旧的条目 - 这是具有最低标识符的条目。
如果我要写SQL,我会说这样的话:
SELECT id, class FROM entry ORDER BY id ASC LIMIT 1
但我在将此查询转换为持久性时遇到问题。它应该看起来像
nextEntry <- selectFirst [] [Asc EntryId, LimitTo 1]
但是这给了我一个语法错误,抱怨没有数据构造函数EntryId
。实际上,EntryId
是Database.Persist.Class.PersistEntity.Key Entry
的类型同义词,因此不能在Asc
数据构造函数中使用,它的类型为forall typ . Asc (EntityField record typ)
。
所以问题是如何通过表格的主键来查询我的查询结果?
答案 0 :(得分:2)
那应该真的有效; EntryId
都是类型和数据构造函数。例如,以下代码(仅从persistent chapter of the Yesod book的概要中调整)编译得很好:
{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
import Control.Monad.IO.Class (liftIO)
import Database.Persist
import Database.Persist.Sqlite
import Database.Persist.TH
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Person
name String
age Int Maybe
deriving Show
|]
main :: IO ()
main = runSqlite ":memory:" $ do
runMigration migrateAll
johnId <- insert $ Person "John Doe" $ Just 35
janeId <- insert $ Person "Jane Doe" Nothing
selectList [] [Asc PersonId] >>= liftIO . mapM_ print