2011-12-26 10 views
36

Sono nuovo sia per Haskell che per Yesod e sto cercando di creare una semplice applicazione Web in grado di rispondere alle query da un'API esterna. Ho creato un parser (usando Parsec), che mi ottiene l'ID di un'entità che voglio caricare come un normale valore Int.Yesod: Ottenere un'entità database per ID da un Int

Tuttavia, io per la vita di me non riesco a capire come trasformare questo Int in qualcosa che get accetterà (vale a dire un Key (?)). Tutti gli esempi nella documentazione ottengono l'id solo dagli inserimenti precedenti o dalla spedizione dell'URL.

Qualsiasi aiuto sarebbe molto apprezzato, in quanto mi sembra di essere bloccato ... :)

+4

Va bene, ho capito questo grazie alle belle persone su #yesod: Per creare una chiave da un Int, 'i ', (o Int64, in questo caso) e per un backend del database, la sintassi è' Key $ PersistInt64 i'. Questo creerà la chiave e il compilatore individuerà quale entità prelevare dal contesto (ad esempio, informazioni sul tipo associate all'uso della chiave). –

+4

Sentiti libero di rispondere alla tua domanda in modo che sia chiusa. – dflemstr

risposta

27

Anche se la risposta è già presente nei commenti, vorrei dare un esempio completo.

Supponendo che abbiamo un Person modello, la seguente funzione restituisce un record per il persion con il dato ID (se esiste):

import Database.Persist.Types (PersistValue(PersistInt64)) 

getByIntId :: Integral i => i -> Handler (Maybe Person) 
getByIntId i = runDB $ get $ Key $ PersistInt64 (fromIntegral i) 

Il import è necessario per farci costruire il persistere-versione di un numero intero fromIntegral converte qualsiasi numero intero nel tipo previsto Int64.

Aggiornamento: Dal Yesod 1.2 PersistValue vive nel modulo Database.Persist.Types, prima di 1.2 è stato Database.Persist.Store (API Documentation).

Update 2: Dal persistente 2.0.2 ci sono due funzioni build-in per convertire da/per chiavi di database: toSqlKey e fromSqlKey (API Documentation).

5

PersistInt64 è qui: Database.Persist.Types.

Precedentemente PersistInt64 era qui: Database.Persist.Store.

1

solo un esempio di come utilizzare toSqlKey (2.0.2 Persistent)

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase| 
Users 
    email String 
    password String 
    alias String 
    deriving Show 
|] 

connStr = "host=localhost dbname=communis_db user=communis password=develpass port=5432" 

inBackend :: ReaderT SqlBackend (NoLoggingT (ResourceT IO)) a-> IO a 
inBackend action = runStderrLoggingT $ withPostgresqlPool connStr 10 $ \pool -> liftIO $ do 
    flip runSqlPersistMPool pool $ do 
    runMigration migrateAll 
    action 

toUserId :: Int64 -> UsersId 
toUserId = toSqlKey 

get_user :: Int64 -> IO (Maybe Users) 
get_user = inBackend . get . toUserId 

delete_user :: Int64 -> IO() 
delete_user = inBackend . delete . toUserId 
Problemi correlati