36

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

但是,我一生无法弄清楚如何将这个 Int 变成get可以接受的东西(即Key(?))。文档中的所有示例仅从以前的插入或 url 调度中获取 id。

任何帮助将不胜感激,因为我似乎被卡住了...... :)

4

3 回答 3

28

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

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

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.2PersistValue存在于模块Database.Persist.Types中,因此在 1.2 之前它是Database.Persist.StoreAPI 文档)。

更新 2:自 Persistent 2.0.2 以来,有两个内置函数可以在数据库密钥之间进行转换:toSqlKeyfromSqlKeyAPI 文档,请参阅hhefesto 的回答以获取示例)。

于 2013-01-17T14:15:38.213 回答
5

PersistInt64在这里:Database.Persist.Types

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

于 2012-11-25T13:43:12.440 回答
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
于 2016-03-03T19:26:03.920 回答