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
Escleto를 사용하여 CommitteeView를 작성하는 쿼리를 쉽게 만들 수 있습니다.다음과 같이 됩니다.
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
원칙적으로 상기 쿼리에서 서브쿼리를 실행하여 데이터를 충분히 얻을 수 있습니다.네, 그럴 수 있죠.이제 "group by Haskell-list"를 다음과 같이 사용하려면group by
SQL에 있나요?행을 접어서 사용자 목록을 표시하려면 어떻게 해야 합니까?
라는 인상을 받다esqueleto
케이스를 처리할 수 없습니다(즉, 케이스를 처리할 수 있는 조합기가 없습니다).기본 데이터베이스는 하스켈 목록을 열로 지원하지 않는 것이 분명합니다.하지만, 확실히, 나 혼자만 이 문제에 직면할 수 없습니다.효과적인 전략은 무엇입니까?n-리스트를 n-리스트로 접는 것?또는 실행 중n+1
문의할 수 있습니까?다른 옵션은 없나요?
Esqueleto는 아직 처음부터 서브리스트(다차원 리스트)를 처리할 수 없습니다. Data.List.groupBy
cdk는 그룹화만 할 수 있고 원하는 것은 그룹화 할 수 없습니다.
당신의 경우 클래식한 SQL 쿼리를 사용하는 것이 좋습니다.n+1 쿼리를 실행할 수 있지만, 드물고 자주 사용할 수 없는 함수일 경우에만 캐시된 데이터를 준비합니다(변수 이름에 따라 많이 사용하지 않을 수 있으며 시도해 볼 가치가 있습니다).사용량이 많은 경우 클래식 SQL 사용을 고려해야 합니다.
https://github.com/prowdsponsor/esqueleto 에 접속하면, 다음의 정보를 얻을 수 있습니다.
모든 SQL 기능을 사용할 수 있는 것은 아니지만 대부분의 기능을 쉽게 추가할 수 있습니다(특히 기능).
새로운 기능을 요청해 보세요.행운을 빕니다.
언급URL : https://stackoverflow.com/questions/23751140/handling-list-types-with-esqueleto
'prosource' 카테고리의 다른 글
LINQ의 .Skip(1000)을 쓰는 방법순수 SQL로 취득(100)하시겠습니까? (0) | 2023.04.13 |
---|---|
커밋을 푸시한 후 git에서 어떻게 스쿼시합니까? (0) | 2023.04.13 |
iOS에서 Base64 인코딩을 하려면 어떻게 해야 하나요? (0) | 2023.04.13 |
합병 갈등에 부딪혔어요.마지를 중단하려면 어떻게 해야 하나요? (0) | 2023.04.13 |
설치되어 있는 PowerShell 버전 확인 (0) | 2023.04.08 |