Подтвердить что ты не робот

Yesod: получение объекта базы данных по ID из Int

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

PersistInt64 находится здесь: Database.Persist.Types.

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

Ответ 3

Просто пример использования 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