在持久化中使用 `get` 和 `toSqlKey`
Use of `get` and `toSqlKey` in persistent
我正在尝试将 persistent-postgresql 与 servant 一起使用。
我有一个 User
模型。
我想要一个带有 ID 的端点和 returns 具有该 ID 的用户。
根据其他答案,我可以使用 toSqlKey
将 Int64
变成 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
不同之处在于 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 }
我正在尝试将 persistent-postgresql 与 servant 一起使用。
我有一个 User
模型。
我想要一个带有 ID 的端点和 returns 具有该 ID 的用户。
根据其他答案,我可以使用 toSqlKey
将 Int64
变成 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
不同之处在于 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 }