【问题标题】:What is a correct way of doing COUNT(id) in Esqueleto and Yesod在 Esqueleto 和 Yesod 中执行 COUNT(id) 的正确方法是什么
【发布时间】:2014-07-24 02:49:37
【问题描述】:

我正在尝试弄清楚如何使用 Esqueleto 编写以下查询

SELECT COUNT("person"."id")
FROM "person"
WHERE (("person"."admin" = 't' OR "person"."vip" = 't') // 't' as in True
      OR "person"."karma" >= 5000 AND "person"."hellbanned" = 'f')

这是我的模型的定义方式

Person
    admin Bool
    vip Bool
    karma Int
    hellbanned Bool

除了COUNT 部分之外,我几乎得到了所有东西

select $
  from $ \p -> do
    where_
      ((p ^. PersonAdmin ==. val True) ||. (p ^. PersonVip ==. val True)
      &&. (p ^. PersonKarma >=. val 5000) &&. (p ^. PersonHellbanned ==. val False))
    return $ p ^. PersonId

我设法找到了一个countRows 函数,但是我还没有设法找到一种方法来以一种类型检查的方式将这两者结合起来。

我也不确定是否需要 where 子句的每个分支中的所有 p ^.,或者是否可以以某种方式将它们折叠在一起?

【问题讨论】:

标签: haskell yesod persistent esqueleto


【解决方案1】:

这是我的一些旧代码,可以计算,我不太记得了,但希望它有所帮助!

selectCount
  :: (From SqlQuery SqlExpr SqlBackend a)
  => (a -> SqlQuery ()) -> Persist Int
selectCount q = do
  res <- select $ from $ (\x -> q x >> return countRows)
  return $ fromMaybe 0 $ (\(Value a) -> a) <$> headMay res

getCount :: RepositoryUri -> Persist Int
getCount ruri =
  selectCount $ \(r `InnerJoin` rs) -> do
    on     $ r ^. R.RepositoryId  ==. rs ^. Repo
    where_ $ r ^. R.Uri ==. val ruri

【讨论】:

    【解决方案2】:

    我发现 Adam Bergmark 的回答非常有用,但我认为它应该提供更多信息:

    import Import hiding ( Value )
    import Data.Maybe ( maybeToList
                      , listToMaybe )
    import Database.Esqueleto
    import Database.Esqueleto.Internal.Language (From)
    
    selectCount
      :: (From SqlQuery SqlExpr SqlBackend a)
      => (a -> SqlQuery ()) -> YesodDB App Int
    selectCount q = do
      res <- select $ from $ (\x -> q x >> return countRows)
      return $ fromMaybe 0 . listToMaybe . fmap (\(Value v) -> v) $ res
    

    【讨论】:

    • 这很好用(在浪费了 1-2 小时之后):) 为什么这不只是内置的?我不明白...
    猜你喜欢
    • 1970-01-01
    • 2014-07-04
    • 2020-06-28
    • 2012-02-25
    • 2021-09-12
    • 2021-08-23
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多