2011-12-26 11 views
36

Jestem nowym użytkownikiem zarówno Haskella, jak i Yesoda, i próbuję zbudować prostą aplikację internetową, która może odpowiadać na zapytania z zewnętrznego interfejsu API. Zbudowałem parser (używając Parsec), który dostarczy mi identyfikator podmiotu, który chcę załadować jako zwykłą wartość Int.Yesod: Pobieranie jednostki bazy danych według identyfikatora z Int

Jednak ja nie mogę zrozumieć, jak przekształcić tę Int w coś, co zaakceptuje get (tj. Wszystkie przykłady w dokumentacji otrzymują identyfikator tylko z poprzednich insertów lub z wysyłania adresu URL.

Każda pomoc będzie bardzo mile widziane, bo wydają się być zatrzymany ... :)

+4

Dobra, zdobione to dzięki miłych ludzi na #yesod: Aby utworzyć klucz z Int 'I ', (lub Int64, w tym przypadku) i dla zaplecza bazy danych, składnia to' Key $ PersistInt64 i'. Spowoduje to utworzenie klucza, a kompilator wykryje, która jednostka ma zostać pobrana z kontekstu (tj. Informacja o typie powiązana z użyciem klucza). –

+4

Możesz odpowiedzieć na własne pytanie, aby zostało zamknięte. – dflemstr

Odpowiedz

27

Nawet jeśli odpowiedź można już znaleźć w komentarzach, chciałbym podać pełny przykład.

Zakładając, że mamy Person modelu Poniższa funkcja zwraca rekord persion z danym ID (jeśli istnieje):

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

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

import jest potrzebne, aby pozwolić nam skonstruować utrzymują-wersję Liczba całkowita. fromIntegral konwertuje dowolną liczbę całkowitą do oczekiwanego typu Int64.

Aktualizacja: Ponieważ jesod 1.2 PersistValue mieszka w module Database.Persist.Types, zanim 1,2 było Database.Persist.Store (API Documentation).

Aktualizacja 2: Ponieważ Trwałych 2.0.2 istnieją dwie funkcje Wbudowany przekonwertować z/do bazy danych kluczy: toSqlKey i fromSqlKey (API Documentation).

5

PersistInt64 jest tutaj: Database.Persist.Types.

Poprzednio PersistInt64 był tutaj: Database.Persist.Store.

1

tylko przykład jak używać toSqlKey (Persistent 2.0.2)

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