Eco*_*ium 2 haskell yesod esqueleto
我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)
我想这样做:
select category,sum(amount) from my_table group by category;
category|sum(amount)
A|3.0
B|10.0
Run Code Online (Sandbox Code Playgroud)
这是我的查询:
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' )
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
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 ...;
.... }
Run Code Online (Sandbox Code Playgroud)
我在哪里提供类型信息E.select?编译器应该能够从中推断t E.^.MyTableCategory吗?我也在countRows / groupBy这里使用示例(https://hackage.haskell.org/package/esqueleto-1.4.1/docs/Database-Esqueleto.html),但是存在类似的问题(唯一的区别是我没有加入)
感谢你的帮助。
谢谢!
在从表参数类型有时从必须是明确的结果类型推断。
通常,有关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
Run Code Online (Sandbox Code Playgroud)
更新:它编译
| 归档时间: |
|
| 查看次数: |
712 次 |
| 最近记录: |