Yesod: получение объекта базы данных по ID из Int
Я новичок в Haskell и Yesod, и пытаюсь создать простое веб-приложение, которое может отвечать на запросы из внешнего API. Я создал парсер (используя Parsec), который получает мне идентификатор объекта, который я хочу загрузить, как регулярное значение Int.
Однако я для жизни не могу понять, как превратить этот Int во что-то, что примет get
(то есть a Key
(?)). Все примеры в документации получают только идентификатор из предыдущих вставок или от отправки URL.
Любая помощь будет принята с благодарностью, поскольку я, кажется, застрял...:)
Ответы
Ответ 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