Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

QuerySet 이 생성하는 SQL 구조 [중요] [간단] #6

Open
KimSoungRyoul opened this issue Sep 19, 2020 · 0 comments
Open

QuerySet 이 생성하는 SQL 구조 [중요] [간단] #6

KimSoungRyoul opened this issue Sep 19, 2020 · 0 comments

Comments

@KimSoungRyoul
Copy link
Owner

이런식으로 QuerySet을 작성하면 아래와 같은 SQL이 발생한다.

QuerySet이 만드는 SQL은 이 구조를 벗어나지 않는다. (FilteredRelation(), extra()같은 메서드들을 사용안한다는 전제 )

따라서 내가 원하는 SQL 또는 데이터 들이 이런 구조를 벗어나는지 한번 고민해보자

벗어난다면 NativeSQL 또는 .raw(RawQuerySet)을 사용하자


QuerySet

queryset = (Model.objects
            .select_related('정방향_참조필드1,','정방향_참조필드2',....) # n개 만큼 JOIN 한다. 
            .annotate(커스텀프로퍼티_블라블라=F('모델필드아무거나'),  
                      커스텀프로퍼티2_블라블라=Case(
                          When(Case조건절_모델필드아무거나__isnull=False,  # filter질의는 아무거나 다 가능 __gte, __in 등등...
                               then=Count('특정모델필드')), # 해당 값 기준으로 Count() 함수를 질의함
                          default=Value(0, output_field=IntegerField(
                                      help_text='해당 애트리뷰트 결과값을 django에서 무슨타입으로 받을건지 선언하는 param입니다.'),
                          ),
                      ))
            .filter(각종_질의~~~~)
            .prefetch_related(
                        Prefetch('역방향_참조필드', # 추가 쿼리는 새로운 쿼리셋이다 여기서 쿼리셋에 원하는 튜닝이 가능 
                                       queryset=(역방향_참조모델.objects
                                                 .select_related('역방향_참조모델의_정방향참조모델').filter(역방향_각종_질의문))
                                                # .prefetch_related('역방향_참조모델의_역(정)방향참조모델') 이런식으로도 가능
                                )
            )
            )

SQL

SELECT *
       모델필드아무거나 AS 커스텀프로퍼티_블라블라,
       CASE
           WHEN Case조건절_모델필드아무거나 IS NOT NULL
               THEN COUNT('특정모델필드')
        ELSE 0 END AS 커스텀프로퍼티_블라블라2,  # IntegerField()는 쿼리에서는 영향없음
      
FROM `orm_practice_app_order`
         LEFT INNER JOIN '정방향 참조필드1'  # INNER OUTER 는 ForignKey(null= True or False 값에 의해 결정
                         ON (~~~~)
         LEFT OUTER JOIN '정방향 참조필드2'  # INNER OUTER 는 ForignKey(null= True or False 값에 의해 결정
                         ON (~~~~)
WHERE (각종_질의~~~~)


SELECT *
FROM 역방향_참조모델
         INNER JOIN '역방향_참조모델의_정방향참조모델'
                    ON (~~~~~)
WHERE (역방향_각종_질의문 AND 메인쿼리의_Model.`related_id` IN (1,2,3,4,....));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant