nom*_*men 144 sql haskell list esqueleto
我将数据类型定义为:
data ComitteeView = CommitteeView { committeeId :: CommitteeId
, committeeMembers :: [Person]
}
data CommitteesView = CommitteesView { committeeView :: [CommitteeView] }
Run Code Online (Sandbox Code Playgroud)
现在,就目前而言,我将Persistent模型定义为:
Person
name Text
Committee
name Text
CommitteePerson
personId PersonId
committeeId CommitteeId
Run Code Online (Sandbox Code Playgroud)
我可以很容易地使用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
Run Code Online (Sandbox Code Playgroud)
现在,考虑填充问题CommitteesView
.原则上,我们通过在上面的查询中运行子查询来获取足够的数据来填充.好的,公平的.现在我如何group by
在SQL中使用"由Haskell-list组" ?如何折叠行以便最终得到人员列表?
我得到的印象是esqueleto
无法处理这种情况(即,它没有组合器可以做到这一点).而我的底层数据库显然不支持Haskell列表作为列.但是,当然,我不能成为唯一一个面对这个问题的人.什么是有效的策略?将n列表列表折叠到n列表中?还是运行n+1
查询?还有其他选择吗?
Esqueleto还不打算处理开箱即用的子列表(多维列表)列表!Data.List.groupBy
建议您的“cdk”只能对自身进行分组,而不是您所要求的内容。
对于你的情况,我强烈建议你使用经典的 SQL 查询。您可以运行 n+1 查询,但只有当它是罕见且不经常使用的函数时才这样做,例如准备缓存数据(根据您的变量名称,我认为它可能不会被大量使用并且值得一试)。对于大量使用,毫无疑问您应该考虑使用经典 SQL。
如果您访问https://github.com/prowdsponsor/esqueleto您会发现:
并非所有 SQL 功能都可用,但大多数功能都可以轻松添加(尤其是函数)。
所以你可以尝试要求一个新功能。祝你好运!