Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何按主键从表排序中进行选择_Haskell_Persistent - Fatal编程技术网

Haskell 如何按主键从表排序中进行选择

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

我有一个SQLite持久模式:

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数据构造函数,只看到类型同义词。很抱歉: