Постоянное несоответствие типа selectList 'Database.Persist.Sql.Types.Internal.SqlBackend'

Я работаю над приложением Servant 0.7.1 и пытаюсь использовать Persistent-2.5 для запроса базы данных Postgresql, но я получаю несоответствующие типы с помощью запроса Persistent.

Это приложение ранее работало с Servant 0.4 и Persistent 2.2, но когда я перешел на Servant 0.7.1 для того, чтобы попробовать материал BasicAuth (другой stack решатель, поэтому я в конечном итоге с более высокой версией Persistent тоже) я поменял с EitherT ServantErr IO Слуги Handler монада, и по какой-то причине я больше не мог заставить персистентный запрос компилироваться.

Вот мое определение модели:

share [mkPersist sqlSettings] [persistLowerCase|
ESeries json
    label String
    name String Maybe
    relatedId ESeriesId Maybe
|]

Основываясь на этом блоге, у меня есть runDb функция, которая выглядит так, которая будет работать внутри ReaderT:

runDb query = do
    pool <- asks getPool
    liftIO $ runSqlPool query pool

Наконец, у меня есть следующее определение API и обработчик:

type ESeriesApi = "series" :> Get '[JSON] [ESeries]

eSeriesApi :: Proxy ESeriesApi
eSeriesApi = Proxy

type AppM = ReaderT Config Handler

readerToHandler :: Config -> AppM :~> Handler
readerToHandler cfg = Nat $ \x -> runReaderT x cfg

eServer :: Config -> Server ESeriesApi
eServer cfg = enter (readerToHandler cfg) eSeriesServer

app :: Config -> Application
app cfg = serve eSeriesApi (eServer cfg)

eSeriesServer :: ServerT ESeriesApi AppM
eSeriesServer = allSeries

allSeries :: AppM [ESeries]
allSeries = do
  series <- runDb $ selectList [] []
  let results = map (\(Entity _ e) -> e) series
  liftIO $ sequence results

Я пробовал много разных вариантов, но это всегда сводится к одной и той же ошибке:

   • Couldn't match type ‘persistent-2.5:Database.Persist.Class.PersistEntity.PersistEntityBackend
                             (IO ESeries)’
                     with ‘Database.Persist.Sql.Types.Internal.SqlBackend’
        arising from a use of ‘selectList’
    • In the second argument of ‘($)’, namely ‘selectList [] []’
      In a stmt of a 'do' block: series <- runDb $ selectList [] []
      In the expression:
        do { series <- runDb $ selectList [] [];
             let results = map (\ (Entity _ e) -> ...) series;
             liftIO $ sequence results }

Кажется, что selectList не возвращает правильный тип?


Редактировать:

Я должен был упомянуть, что я пытаюсь сделать это с Persistent 2.5, и этот код ранее работал с более ранними версиями Persistent.

Это выглядит как runSqlPool ожидает SqlPersistT или же ReaderT SqlBackend но selectList возвращается PersistEntityBackend (IO ESeries)

0 ответов

Другие вопросы по тегам