我正在开发一个 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
monad,由于某种原因,我无法再编译 Persistent 查询。
这是我的模型定义:
share [mkPersist sqlSettings] [persistLowerCase|
ESeries json
label String
name String Maybe
relatedId ESeriesId Maybe
|]
基于this blog-post,我有一个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)