Esqueleto를 사용하여 목록 유형 처리


144

다음과 같이 정의 된 데이터 유형이 있습니다.

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를 사용하여 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 bySQL 에서처럼 "group by Haskell-list"를 어떻게 사용할 수 있습니까? 사람들의 목록으로 끝나도록 행을 어떻게 접을 수 있습니까?

esqueleto사례를 처리 할 수없는 인상을받습니다 (즉,이를 수행 할 결합기가 없습니다). 그리고 내 기본 데이터베이스는 분명히 Haskell 목록을 열로 지원하지 않습니다. 그러나 분명히이 문제에 직면 할 수있는 유일한 사람은 아닙니다. 효과적인 전략은 무엇입니까? n- 목록을 n- 목록으로 접기? 아니면 n+1쿼리를 실행 합니까? 다른 옵션이 있습니까?


2
봤어 Data.List.groupBy?
cdk

@ cdk : 그래, 그게 내가 겪은 일이다. 그러나 놀랍게도 털이 있습니다.
nomen

답변:


2

Esqueleto는 아직 하위 목록 (다차원 목록) 목록을 처리 하지 않습니다 . Data.List.groupBy그 'cdk'는 그룹 자체 만 나열 할 수 있지만 요청한 것은 아닙니다.

귀하의 경우 고전적인 SQL 쿼리를 사용하는 것이 좋습니다. n + 1 쿼리를 실행할 수 있지만 드물고 자주 사용할 수없는 기능 인 경우에만 캐시 된 데이터를 준비하는 것과 같이 수행하십시오 (변수 이름을 기반으로 많이 사용되지 않을 수도 있고 시도해 볼 가치가 있다고 생각합니다). 사용량이 많은 경우 의심의 여지없이 클래식 SQL 사용을 고려해야합니다.

https://github.com/prowdsponsor/esqueleto 로 이동하면 다음을 찾을 수 있습니다.

모든 SQL 기능을 사용할 수있는 것은 아니지만 대부분의 기능을 쉽게 추가 할 수 있습니다 (특히 기능).

새로운 기능을 요청할 수 있습니다. 행운을 빕니다!


이것에 대한 소스 링크가 있습니까? 누군가가 이것이 정답인지 확인하거나 어떤 종류의 문서를 제공 할 수 있다면 현상금을 기꺼이 수여 할 것입니다.
Tech Savant

@ NotoriousPet0 haskell 웹 사이트 를 방문하면 전체 예제 및 사용 사례 목록을 찾을 수 있으며 "내부 조인"과 같은 다차원 목록을 사용하지는 않습니다. 거기에서 "group by"를 검색하면 튜플에 여러 열을 묶거나 추가 집계 함수로 정렬하는 데 사용할 수 있습니다. 또한 개발자는 Esqueleto가 모든 쿼리를 지원하기 위해 훨씬 유연하게 만들려고하므로 여기 에서 추가 확장을 요청할 수 있습니다 .
Kainax
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.