2016-08-20 5 views
0

나는 서번트와 함께 persistent-postgresql을 사용하려고합니다.영구적으로`get`과`toSqlKey` 사용

나는 User 모델을 가지고 있습니다.

id를 사용하여 해당 ID를 가진 사용자를 반환하는 끝점을 갖고 싶습니다.

다른 답변에 따르면 나는 get에 공급하는 Key 내로 Int64을 설정하는 toSqlKey를 사용할 수 있습니다.

oneUser :: Int64 -> App (Entity User) 
oneUser userId = do 
    maybeUser <- runDb $ get $ toSqlKey userId 
    case maybeUser of 
    Nothing -> 
     throwError err404 
    Just user -> 
     return user 

은 내가 사용 selectListCouldn't match expected type ‘PersistEntityBackend (Entity User)’ with actual type ‘SqlBackend’

잘 작동 오류를 얻을 컴파일 할 때 : 같은

내 기능을 보인다.

allUsers :: App [Entity User] 
allUsers = runDb $ selectList [] [] 

내가 잘못하고있는 부분과 앞으로 이런 부분을 봐야하는 곳을 알려주십시오.

runDb :: (MonadReader Config m, MonadIO m) => SqlPersistT IO b -> m b 
runDb query = do 
    pool <- asks getPool 
    liftIO $ runSqlPool query pool 

this github project에서 촬영 : 나는 hackage에 get/

runDb의 모습 stackage 등의 라이브러리의 올바른 버전을 찾을 수 없습니다.

답변

2

의 차이는 get ...는 일반 User 아닌 Entity 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 문에 변경 :

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

거기에'let maybeUser = Nothing'이 뭐예요? 그건 오타예요? – leighman

+0

그것은 실험에서 남은 것입니다 :-) 방금 다시 테스트했고, 그 라인없이 작동합니다. – ErikR

+0

감사합니다. 엔티티 데이터 생성자는 내가 찾고 있던 것이다. – leighman