我试图在servant中使用persistent-postgresql。
我有一个User
型号。
我希望有一个带有id的端点并返回具有该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 [] []
请告诉我我做错了什么,以及今后我应该在哪里看到这样的事情。我无法在hackage上找到get
/在堆叠上找到正确版本的库。
runDb
看起来像:
runDb :: (MonadReader Config m, MonadIO m) => SqlPersistT IO b -> m b
runDb query = do
pool <- asks getPool
liftIO $ runSqlPool query pool
答案 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 }