簡體   English   中英

使用Esqueleto處理List類型

[英]Handling List-types with Esqueleto

我將數據類型定義為:

data ComitteeView = CommitteeView { committeeId :: CommitteeId
                                  , committeeMembers :: [Person] 
                                  }

data CommitteesView = CommitteesView { committeeView :: [CommitteeView] }

現在,就目前而言,我將Persistent模型定義為:

Person
  name  Text

Committee
  name  Text

CommitteePerson
  personId    PersonId
  committeeId CommitteeId

我可以很容易地使用Esqueleto創建一個填充委員會視圖的查詢。 它會是這樣的:

getCommitteeView cid = 
  CommitteeView <$> runDB $ 
    select $
      from (person `InnerJoin` pxc `InnerJoin` committee) -> do
        on  (committee ^. CommitteeId ==. pxc ^. CommitteePersonCommitteeId)
        on  (person ^. PersonId       ==. pxc ^. CommitteePersonPersonId)
        where_ (committee ^. CommitteePersonCommitteeId ==. val cid)
        return person

現在,考慮填充CommitteesView的問題。 原則上,我們通過在上面的查詢中運行子查詢來獲取足夠的數據來填充。 好的,公平的。 現在我如何在SQL中使用像group by Haskell-list這樣的“group by Haskell-list”? 如何折疊行以便最終得到人員列表?

我得到的結論是, esqueleto無法處理這種情況(即,它沒有組合器會這樣做)。 而我的底層數據庫顯然不支持Haskell列表作為列。 但是,當然,我不能成為唯一一個面對這個問題的人。 什么是有效的策略? 將n列表列表折疊到n列表中? 或者運行n+1查詢? 還有其他選擇嗎?

Esqueleto 並不意味着處理子列表的列表(多維列表)開箱呢! Data.List.groupBy '建議你可以分組只列出自己,但不是你要求的。

對於您的情況,我會堅持建議您使用經典的SQL查詢。 您可以運行n + 1個查詢,但只有在它很少且通常不可用的函數時才這樣做,例如准備緩存數據(基於您的變量名稱,我認為它可能不會被大量使用,值得一試)。 對於大量使用,您應該毫無疑問地考慮使用經典SQL。

如果您將訪問https://github.com/prowdsponsor/esqueleto,您會發現:

並非所有SQL功能都可用,但大多數功能都可以輕松添加(尤其是功能)。

所以你可以試着要求一個新功能。 祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM