gpt4 book ai didi

haskell - 如何在 Esqueleto 查询中使用 Group By 和 Sum

转载 作者:行者123 更新时间:2023-12-01 22:24:40 25 4
gpt4 key购买 nike

我正在尝试使用 Esqueleto 中的示例查询之一,但无法编译它。唯一的变化是我在没有连接的情况下使用它。

我有一个如下所示的表格:

sqlite> select * from my_table;
id|category|amount
1|A|1.0
2|A|2.0
3|B|2.0
4|B|8.0

我想这样做:

select category,sum(amount) from my_table group by category;
category|sum(amount)
A|3.0
B|10.0

这是我的查询:

import qualified Database.Esqueleto as E

r <- runDB $
E.select $ E.from $ \t -> do
E.groupBy $ t E.^. MyTableCategory
let sum' = E.sum_ (t E.^. MyTableAmount)
E.orderBy [E.desc sum']
return (t E.^. MyTableCategory, sum' )

我收到此错误:

No instance for (PersistField b0) arising from a use of `E.select'
The type variable `b0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there are several potential instances:
instance PersistField Account -- Defined in `Model'
instance PersistField AccountCategory -- Defined in `Model'
instance PersistField MyTable -- Defined in `Model'
...plus 37 others
In the expression: E.select
In the second argument of `($)', namely
`E.select
$ E.from
$ \ t
-> do { E.groupBy $ t E.^. MyTableCategory;
let ...;
.... }'
In a stmt of a 'do' block:
r <- runDB
$ E.select
$ E.from
$ \ t
-> do { E.groupBy $ t E.^. MyTableCategory;
let ...;
.... }

在哪里提供 E.select 的类型信息?编译器是否应该能够从 t E.^.MyTableCategory 进行推断?我还尝试在此处使用 countRows/groupBy 示例( https://hackage.haskell.org/package/esqueleto-1.4.1/docs/Database-Esqueleto.html ),但出现类似问题(唯一的区别是我没有联接)

感谢您的帮助。

谢谢!

最佳答案

from 表参数类型有时是从结果类型推导出来的,结果类型必须是显式的。

通常会出现关于 monad 类型的其他歧义。

将查询包含在特定函数中可以解决一些歧义。

我现在无法证明您的esqueleto查询符合性,但是

试试这个:

{-# LANGUAGE PackageImports, ConstraintKinds #-}

import Import
import "esqueleto" Database.Esqueleto as E
import "monad-logger" Control.Monad.Logger (MonadLogger)
import "resourcet" Control.Monad.Trans.Resource (MonadResourceBase)

type TCategory = Text -- change it if its different
type TAmount = Double

myQuery :: (PersistQuery (SqlPersist m), MonadLogger m , MonadResourceBase m) =>

SqlPersist m [(E.Value TCategory, E.Value (Maybe TAmount))] -- corrected
myQuery = do

-- your query

E.select $ E.from $ \t -> do
E.groupBy $ t E.^. MyTableCategory
let sum' = E.sum_ (t E.^. MyTableAmount)
E.orderBy [E.desc sum']
return (t E.^. MyTableCategory, sum' )

-- within your handler:

pairListResult <- runDB myQuery

forM_ pairListResult $ \(E.Value categ, E.Value maybeAmount) -> do -- whatever

更新:已编译

关于haskell - 如何在 Esqueleto 查询中使用 Group By 和 Sum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23589754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com