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

Posted

技术标签:

【中文标题】尝试使用我的模型设置 Esqueleto 时出错【英文标题】:Error trying to setup Esqueleto with my models 【发布时间】:2014-10-15 14:20:10 【问题描述】:

今天早上我开始在 Yesod 应用程序中设置 Esqueleto。我真的在尝试做一个 LeftOuterJoin,但我已经将查询简化了很多,以使基础工作正常。我什至无法理解。为了确保与 Database.Persist.Query 没有冲突,我遵循了一些 advice from a Github issue 将我的查询提取到不导入 Yesod 的单独文件中。我在配置 Esqueleto 时缺少什么?

FWIW,我正在使用 Yesod 1.4.0、Persistent 2.1 和 Esqueleto 2.1。

这是我遇到的错误:

Queries.hs:9:15:
    No instance for (Database.Esqueleto.Internal.Sql.SqlSelect
                       (SqlExpr (Entity UrlEntry), SqlExpr (Entity UrlEntryData))
                       (Entity UrlEntry))
      arising from a use of ‘select’
    In the expression: select
    In the expression:
      select
      $ from
        $ \ (entry `InnerJoin` entryData)
            -> do  on
                    $ entry ^. UrlEntryId ==. entryData ^. UrlEntryDataUrlEntryId;
                    return (entry, entryData) 
    In an equation for ‘findEntries’:
        findEntries
          = select
            $ from
              $ \ (entry `InnerJoin` entryData)
                  -> do  on
                          $ entry ^. UrlEntryId ==. entryData ^. UrlEntryDataUrlEntryId;
                          .... 

这是我的模型:

UrlEntry
    url String
    shortCode String
    ShortCode shortCode
    visits Int default=0
    userId UserId Eq
    deriving Eq Show
UrlEntryData
    screenshot String Maybe
    title String Maybe
    favicon String Maybe
    contentType String
    urlEntryId UrlEntryId Eq
    deriving Eq Show
User
    email Text
    password Text Maybe
    verkey Text Maybe
    verified Bool
    UniqueUser email
    deriving Eq Show Typeable

这是我的查询:

findEntries :: SqlPersistT Handler [Entity UrlEntry]
findEntries = select $ from $ \(entry `InnerJoin` entryData) -> do
      on $ entry ^. UrlEntryId ==. entryData ^. UrlEntryDataUrlEntryId
      -- where_ (entry ?. UrlEntryUserId  ==. valkey authId)
      return (entry, entryData)

【问题讨论】:

dunno 是否有帮助,但我在我的玩具 learn-yesod 项目中使用 esquelito,这里:github.com/bburdette/hackstarter/blob/master/Handler/Project.hs 我认为它使用 esquelito 1.4 或其他东西(在 nixos 上编译所以可能有点奇怪的包版本)。 【参考方案1】:

您需要更改函数签名。

findEntries :: SqlPersistT Handler [(Entity UrlEntry, Entity UrlEntryData)]

【讨论】:

以上是关于尝试使用我的模型设置 Esqueleto 时出错的主要内容,如果未能解决你的问题,请参考以下文章

用 esqueleto 计算行数

GreenDao 生成器类在生成模型和 dao 类时出错。

尝试拟合 ARIMA 模型时 xy.coords 出错,请告知

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

Tensorflow 训练模型在云端机器上工作,但在我的本地电脑上使用时出错

尝试将我的keras模型导出到tensorflow服务时出错