2014-11-24 3 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 данных. Действительно, EntryId является синонимом типа для Database.Persist.Class.PersistEntity.Key Entry, поэтому его нельзя использовать в конструкторе данных Asc, который имеет тип forall typ . Asc (EntityField record typ).

Итак, вопрос в том, как я могу сделать постоянный заказ результатами моего запроса по первичному ключу таблицы?

ответ

2

Это должно действительно работать; EntryId is как тип и конструктор данных. Например, следующий код (только переделаны из синопсис 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 splices и не заметил, что на самом деле существует конструктор данных EntryId, который видит только синоним типа. Простите за это :( – Anton