prosource

Esqueleto를 사용한 목록 유형 처리

probook 2023. 4. 13. 20:55
반응형

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 bySQL에 있나요?행을 접어서 사용자 목록을 표시하려면 어떻게 해야 합니까?

라는 인상을 받다esqueleto케이스를 처리할 수 없습니다(즉, 케이스를 처리할 수 있는 조합기가 없습니다).기본 데이터베이스는 하스켈 목록을 열로 지원하지 않는 것이 분명합니다.하지만, 확실히, 나 혼자만 이 문제에 직면할 수 없습니다.효과적인 전략은 무엇입니까?n-리스트를 n-리스트로 접는 것?또는 실행 중n+1문의할 수 있습니까?다른 옵션은 없나요?

Esqueleto는 아직 처음부터 서브리스트(다차원 리스트)를 처리할 수 없습니다. Data.List.groupBycdk는 그룹화만 할 수 있고 원하는 것은 그룹화 할 수 없습니다.

당신의 경우 클래식한 SQL 쿼리를 사용하는 것이 좋습니다.n+1 쿼리를 실행할 수 있지만, 드물고 자주 사용할 수 없는 함수일 경우에만 캐시된 데이터를 준비합니다(변수 이름에 따라 많이 사용하지 않을 수 있으며 시도해 볼 가치가 있습니다).사용량이 많은 경우 클래식 SQL 사용을 고려해야 합니다.

https://github.com/prowdsponsor/esqueleto 에 접속하면, 다음의 정보를 얻을 수 있습니다.

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

새로운 기능을 요청해 보세요.행운을 빕니다.

언급URL : https://stackoverflow.com/questions/23751140/handling-list-types-with-esqueleto

반응형