Haskell 如何按主键从表排序中进行选择
我有一个SQLite持久模式:Haskell 如何按主键从表排序中进行选择,haskell,persistent,Haskell,Persistent,我有一个SQLite持久模式: share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase| Entry class EntryClass |] 这将映射到以下CREATE TABLE语句: CREATE TABLE "entry" ( "id" INTEGER PRIMARY KEY AUTOINCREMENT , "class" INTEGER NOT NULL);" 我手动添加了AUTOIN
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.persistenty.Key条目的类型同义词,因此不能在Asc数据构造函数中使用,该构造函数的类型为forall typ。Asc EntityField记录类型
所以问题是,我如何按照表的主键对查询结果进行持久化排序?这实际上应该是可行的;EntryId既是类型构造函数又是数据构造函数。例如,以下代码刚刚从编译概要中调整过,非常好:
{-# 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
哎呀,我好像忘了从实体模块导出数据构造函数EntryId。在完成正确的导出之后,我的代码编译得很好。我还被生成的模板haskell拼接误导了,没有注意到实际上存在一个EntryId数据构造函数,只看到类型同义词。很抱歉: