Haskell:Yesod 和 Esqueleto

Posted

技术标签:

【中文标题】Haskell:Yesod 和 Esqueleto【英文标题】:Haskell: Yesod and Esqueleto 【发布时间】:2014-03-29 04:50:39 【问题描述】:

如何让 Yesod 1.2 中的 runDB 与 Esqueleto 一起工作?

import Database.Esqueleto as E
getMainR :: Handler html
getMainR = do
        leases <- runDB $ E.select $ 
                          E.from $ \l -> do
                          E.where_ (l E.^. LeaseId E.==. E.val 1)
                          return l

        defaultLayout $ do
          setTitle "Main"

这是错误输出:

Handler/Main.hs:41:27:
    Couldn't match type `persistent-1.3.0.6:Database.Persist.Sql.Types.SqlPersistT'
                  with `SqlPersistT'
    Expected type: YesodDB App [E.Entity val0]
      Actual type: SqlPersistT (HandlerT App IO) [E.Entity val0]
    In the second argument of `($)', namely
      `select
       $ from
         $ \ l
             -> do  where_ (l ^. LeaseId ==. val 1);
                     return l '
    In a stmt of a 'do' block:
      leases <- runDB
                $ select
                  $ from
                    $ \ l
                        -> do  where_ (l ^. LeaseId ==. val 1);
                                return l 
    In the expression:
      do  leases <- runDB $ select $ from $ \ l -> do  ... ;
           defaultLayout $ do  setTitle "Tenants"  

Handler/Main.hs:42:41:
    Couldn't match expected type `E.EntityField val0 typ0'
                with actual type `Import.EntityField
                                    Lease
                                    (Import.KeyBackend
                                       persistent-1.3.0.6:Database.Persist.Sql.Types.SqlBackend
                                       Lease)'
    In the second argument of `(^.)', namely `LeaseId'
    In the first argument of `(==.)', namely `l ^. LeaseId'
    In the first argument of `where_', namely
      `(l ^. LeaseId ==. val 1)'

我试图按照本教程进行操作,但似乎他们的 runDB 设置与 Yesod 脚手架的设置方式不同。 https://github.com/yesodweb/yesod/wiki/Multi-select-field-populated-from-database-(using-esqueleto)

【问题讨论】:

【参考方案1】:

这是一个依赖问题。 Esqueleto 必须使用最新版本的 persistent 和 persistent-sqlite 编译。

【讨论】:

以上是关于Haskell:Yesod 和 Esqueleto的主要内容,如果未能解决你的问题,请参考以下文章

Haskell Persistent 加入 Esqueleto

Haskell,Yesod和Keter - 我如何定期(每5分钟)运行一次例行程序?

Haskell语言学习笔记(69)Yesod

当用户不在 Yesod/Haskell 的数据库中时如何重定向到特殊页面

在 Esqueleto 中获取聚合函数的结果

尝试使用我的模型设置 Esqueleto 时出错