2016-08-20 87 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