2016-08-20 86 views
0

我试图在servant中使用persistent-postgresql。永久使用`get`和`toSqlKey`

我有一个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 [] [] 

请告诉我我做错了什么,我应该在未来看看这样的东西。我找不到get上hackage /库对stackage权等版本

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拍摄。

回答

2

不同的是,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语句:

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

什么是'let maybeUser = Nothing'在里面?这是一个错字吗? – leighman

+0

这是来自实验的剩余物:-)我只是再次测试它,它没有这条线。 – ErikR

+0

谢谢。实体数据构造函数是我一直在寻找的。 – leighman