Yesod:从Int中通过ID获取数据库实体

我是Haskell和Yesod的新手,正在尝试构build一个简单的Web应用程序,可以从外部API回答查询。 我已经构build了一个parsing器(使用Parsec),这使得我想要加载一个实体的ID作为一个常规的Int值。

然而,我终身无法弄清楚如何把这个Int变成一个可以接受的东西(即一个Key (?))。 文档中的所有示例只能获得以前插入的id,或从url派发。

任何帮助将不胜感激,因为我似乎被卡住… 🙂

即使答案已经可以在评论中find,我想举一个完整的例子。

假设我们有一个Person模型,下面的函数返回给定ID(如果存在)的persion的logging:

 import Database.Persist.Types (PersistValue(PersistInt64)) getByIntId :: Integral i => i -> Handler (Maybe Person) getByIntId i = runDB $ get $ Key $ PersistInt64 (fromIntegral i) 

import是需要让我们构造一个整数的持久版本。 fromIntegral将任何整数转换为预期的typesInt64

更新 :由于Yesod 1.2 PersistValue存在于模块Database.Persist.Types ,因此在1.2之前它是Database.Persist.Store ( API文档 )。

更新2 :由于持久2.0.2有两个内置函数来转换/数据库键: toSqlKeyfromSqlKey ( API文档 )。

PersistInt64在这里: Database.Persist.Types

以前PersistInt64在这里: Database.Persist.Store

只是一个如何使用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