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

Use of `get` and `toSqlKey` in persistent

我正在尝试将 persistent-postgresql 与 servant 一起使用。

我有一个 User 模型。

我想要一个带有 ID 的端点和 returns 具有该 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 [] []

请告诉我哪里做错了,以后我应该去哪里寻找类似的东西。我找不到 get hackage/the 正确版本的库等

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.

不同之处在于 get ... return 是一个普通的 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

如果您想 return 一个 Entity User,只需将最后一个 return 语句更改为:

return $ Entity { entityKey = toSqlKey userid, entityVal = person }