如何通过主键从表排序中进行选择

时间:2014-11-24 10:26:44

标签: haskell persistent

我有这个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。实际上,EntryIdDatabase.Persist.Class.PersistEntity.Key Entry的类型同义词,因此不能在Asc数据构造函数中使用,它的类型为forall typ . Asc (EntityField record typ)

所以问题是如何通过表格的主键来查询我的查询结果?

1 个答案:

答案 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