PyPika 튜토리얼 번역 - (2)

city7310·2019년 2월 13일
3
post-thumbnail

1챕터에서 설치까지 다 끝냈으니 이제 진짜 튜토리얼로 내용을 채우겠다. pypika의 주요 클래스는 pypika.Query, pypika.Table, pypika.Field이므로 이들을 먼저 import하자.

Selecting Data

pypika.Query를 통해 쿼리 빌드를 시작할 수 있다. SELECT 쿼리를 통해 테이블에서 데이터를 가져오려면, 먼저 쿼리에 테이블을 추가해야 한다. 정교한 질의를 위해선 pypika.Table을 통해 테이블 객체를 얻어오는 것이 좋지만, 테이블 하나만 있는 간단한 쿼리의 경우 그냥 문자열을 사용해서 이들을 표현할 수도 있다.

쿼리를 raw SQL로 변환하려면, 문자열로 캐스팅하기만 하면 된다.

또는, Query 객체의 get_sql() 메소드를 사용할 수 있다.

pypika.Table을 사용해서 다음과 같이 쿼리를 빌드할 수도 있다.

위 두 예제에서 q.get_sql()의 결과는 다음과 같이 동일하다.

Arithmetic

pypika를 이용해 산술 표현식도 쉽게 표현할 수 있다. +, -, *, /와 같은 연산자는 pypika.Table의 속성이나 pypika.Field를 통해 표현할 수 있다.

아래는 pypika.Table을 사용하는 예다.

alias는 필드와 expression에게 모두 적용할 수 있다.

아래는 그 외의 산술 표현식 예제다.

Filtering

WHERE 절을 표현하려면, pypika.CriterionQuery.where() 메소드에 전달하면 된다. 그냥 원하는 필드에 대해 비교 연산자를 사용하면 알아서 Criterion 객체로 변환된다.

select, where, groupby, orderby와 같은 쿼리 메소드들은 여러 번 호출할 수 있다. where의 경우 여러 번 호출하면 condition들이 AND로 묶인다.

INBETWEEN 절도 지원된다.

BETWEEN은 Python 내장 슬라이싱 연산을 사용하면서, IN은 왜 in 연산자를 사용하지 않았는지 의문이다.

논리 연산자는 boolean symbol들(&, |, ^)을 사용하여 표현한다.

AND

OR

XOR

Ordering, Grouping and Aggregating

Ordering(order by)은 결과를 정렬하고, Grouping(group by)은 결과를 집계하기 위해 사용한다.

GROUP BY절이 쿼리에 추가되면, HAVING 절을 사용할 수 있게 된다. Query.where()과 동일하게, Query.having()Criterion 객체를 파라미터로 받는다.

Joining Tables and Subqueries

USING을 설명하는 부분의 코드가 잘못 작성되어 있어서, 다시 작성했다.

테이블과 서브쿼리는 Query.join() 메소드를 통해 join을 걸 수 있다. 기본적으로 SQL에서 join은 USING이나 ON 절을 포함할 수 있으며 PyPika는 당연히 이들에 대응되는 메소드들을 지원하고 있다.

Query.join().on()

ON 절을 사용하는, 가장 일반적인 형태의 join이다.

Tables라는 표현이 등장했다. 이는 생성자 인자로 전달된 테이블 이름들에 대해 순서대로 Table 객체를 만들어 튜플과 같은 연속열을 반환한다.

Query.join().on_field()

조인 대상의 컬럼 이름이 동일하다면, Query.join().on_field() 메소드에 이름만 넘기는 식으로 ON 쿼리를 자동 구성하도록 만들 수도 있다.

Query.join().using()

위처럼 조인 대상의 컬럼 이름이 동일한 경우, USING 쿼리를 사용하는 것도 방법이다.

ON과 USING의 차이는 Stackoverflow의 MySQL ON vs USING?이라는 질문을 확인하자.

profile
PlanB라는 닉네임으로 활동하고 있는 주니어 백엔드 엔지니어입니다. 자기계발 욕구는 노력충들 전유물이 아니라 세상을 똑바로 살기 위한 기본 태도라고 생각합니다. 기술을 확실하게 이해하고, 성숙한 글을 쓰기 위해 노력하겠습니다.

0개의 댓글