使用 Yesod 和 Persistent 类型不匹配
Posted
技术标签:
【中文标题】使用 Yesod 和 Persistent 类型不匹配【英文标题】:Type mismatch using Yesod and Persistent 【发布时间】:2014-04-30 02:57:25 【问题描述】:我正在尝试在 Yesod 应用中进行持久查询:
userDetails :: UserId -> HandlerT app IO (Maybe UserDetail)
userDetails uid = do
profile <- getBy $ UniqueUser uid
return $ undefined -- the rest of this type checks
我在 getBy 行收到类型错误:
Couldn't match type `PersistMonadBackend (HandlerT App IO)'
with `persistent-1.3.0.6:Database.Persist.Sql.Types.SqlBackend'
Expected type: PersistMonadBackend (HandlerT App IO)
Actual type: PersistEntityBackend Profile
所以,检查 ghci 中的类型:
:t getBy (UniqueUser undefined)
getBy (UniqueUser undefined)
:: ( PersistUnique m,
, PersistMonadBackend m ~ persistent-1.3.0.6:Database.Persist.Sql.Types.SqlBackend
) => m (Data.Maybe.Maybe (Entity Profile))
但是,问题是,我将 Profile 定义为:
Profile
name Text
email Text
user UserId
UniqueUser user
UniqueEmail email
在我的“配置/模型”文件中。发生了什么,我该如何解决?
【问题讨论】:
【参考方案1】:您需要在持久调用周围使用 runDB。
【讨论】:
啊,谢谢。我一定把 getBy404 的类似 Handler 的语义与 getBy 混淆了。以上是关于使用 Yesod 和 Persistent 类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Yesod 的 Persistent 中获取原始键值?
如何让 yesod-persistent 识别我的 aeson 解析实体数组的类型?
如何使用 Yesod/Persistent 访问两个不同的数据库服务器?