Yesod:从Int获取ID的数据库实体

时间:2011-12-26 22:04:24

标签: haskell persistence yesod

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

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

任何帮助都会非常感激,因为我似乎被卡住了...... :)

3 个答案:

答案 0 :(得分:28)

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

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

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

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

需要import来构造整数的persist-version。 fromIntegral会将任何整数转换为预期的类型Int64

更新:由于Yesod 1.2 PersistValue位于模块Database.Persist.Types中,因此在1.2之前它是Database.Persist.StoreAPI Documentation)。

更新2 :由于Persistent 2.0.2有两个内置函数可以从/向数据库键转换:toSqlKeyfromSqlKeyAPI Documentation ,请参阅answer by hhefesto以获取示例。)

答案 1 :(得分:5)

PersistInt64在这里:Database.Persist.Types

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

答案 2 :(得分:2)

仅举例说明如何使用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