2014-11-24 101 views
0

我有這樣的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)

所以問題是我怎麼能通過表的主鍵持久化我的查詢結果?

回答

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 
+0

哎呀,我好像忘了從我的實體模塊導出數據構造'EntryId'。做出正確的導出後,我發現代碼編譯得很好。我還被生成的模板haskell拼接有點誤導,並沒有注意到實際上存在一個EntryId數據構造函數只能看到類型的同義詞。對不起,那:( – Anton 2014-11-24 13:43:47