Yesod: получение объекта базы данных по идентификатору из Int - PullRequest
36 голосов
/ 27 декабря 2011

Я новичок в Haskell и Yesod и пытаюсь создать простое веб-приложение, которое может отвечать на запросы из внешнего API.Я построил синтаксический анализатор (с использованием Parsec), который возвращает мне идентификатор сущности, которую я хочу загрузить, в качестве обычного значения Int.

Однако я на всю жизнь не могу понять, как повернутьэтот Int во что-то, что get примет (то есть Key (?)).Все примеры в документации получают идентификатор только из предыдущих вставок или из рассылки url.

Любая помощь будет принята с благодарностью, поскольку я, похоже, застрял ...:)

Ответы [ 3 ]

28 голосов
/ 17 января 2013

Даже если ответ уже можно найти в комментариях, я хотел бы привести полный пример.

Предполагая, что у нас есть модель Person, следующая функция возвращает запись для персоны сзаданный идентификатор (если он существует):

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

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

import необходим для того, чтобы мы могли создать постоянную версию целого числа.fromIntegral преобразует любое целое число в ожидаемый тип Int64.

Обновление : поскольку Yesod 1.2 PersistValue живет в модуле Database.Persist.Types, до 1.2 оно было Database.Persist.Store ( Документация API ).

Обновление 2 : начиная с версии 2.0.2 имеется две встроенные функции для преобразования из / в ключи базы данных: toSqlKey и fromSqlKey ( API-документация , см. ответ от hhefesto для примера).

5 голосов
/ 25 ноября 2012

PersistInt64 здесь: Database.Persist.Types.

Ранее PersistInt64 был здесь: Database.Persist.Store.

2 голосов
/ 03 марта 2016

Просто пример того, как использовать 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
...