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