[英]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.