在持久化中使用`get`和`toSqlKey`

时间:2016-08-20 15:31:39

标签: haskell persistent servant

我试图在servant中使用persistent-postgresql。

我有一个User型号。

我希望有一个带有id的端点并返回具有该id的用户。

根据其他答案,我可以使用toSqlKeyInt64转换为Key以提供给get

我的功能如下:

oneUser :: Int64 -> App (Entity User)
oneUser userId = do
  maybeUser <- runDb $ get $ toSqlKey userId
  case maybeUser of
    Nothing ->
      throwError err404
    Just user ->
      return user

当我尝试编译时,我收到错误Couldn't match expected type ‘PersistEntityBackend (Entity User)’ with actual type ‘SqlBackend’

使用selectList可以正常使用。

allUsers :: App [Entity User]
allUsers = runDb $ selectList [] []

请告诉我我做错了什么,以及今后我应该在哪里看到这样的事情。我无法在hackage上找到get /在堆叠上找到正确版本的库。

runDb看起来像:

runDb :: (MonadReader Config m, MonadIO m) => SqlPersistT IO b -> m b
runDb query = do
  pool <- asks getPool
  liftIO $ runSqlPool query pool

取自this github project

1 个答案:

答案 0 :(得分:3)

区别在于get ...返回普通User而不是Entity User,因此这将有效:

altSingleUser :: Int64 -> App User
altSingleUser userid = do
    let foo = get (toSqlKey userid) :: SqlPersistT IO (Maybe User)
    maybeUser <- runDb $ foo
    case maybeUser of
         Nothing ->
            throwError err404
         Just person ->
            return person

如果要返回Entity User,只需将最后一个返回语句更改为:

return $ Entity { entityKey = toSqlKey userid, entityVal = person }
相关问题