Tigris
묵묵히 걸어가기
Tigris
전체 방문자
오늘
어제
  • 분류 전체보기 (40)
    • CS (15)
      • Algorithms (1)
      • Linux (3)
      • Python (4)
      • Git & Github (2)
      • Cloud Service (1)
    • Data Science (8)
      • Maching Learning (9)
      • Framework (1)
    • Notes (2)
    • Data (4)

태그

  • python
  • Transformer
  • 파이썬
  • 딥러닝
  • 어텐션
  • 트랜스포머
  • 한빛미디어
  • attention
  • 나는리뷰어다
  • Deep learning
hELLO · Designed By 정상우.
Tigris

묵묵히 걸어가기

Data

SQLAlchemy. 조건식의 원하는 곳에 괄호 추가하기

2023. 9. 4. 20:23

Calendar라는 테이블에 Mapping되는 모델을 다음과 같이 정의했다고 하자.

from sqlalchemy import Column, INTEGER
from sqlalchemy.orm import declarative_base


Base = declarative_base()

class Calendar(Base):
	__tablename__ = "calendar"

	year = Column(INTEGER, primary_key=True)
	month = Column(INTEGER, primary_key=True)
	day = Column(INTEGER, primary_key=True)
	...

위 테이블에서 2021년 12월과 2022년 1월의 정보를 얻고자 하면 다음과 같이 SQL Query를 작성할 것이다.

SELECT ...
FROM calendar
WHERE (year == 2021 AND month == 12) OR (year == 2022 AND month = 1)

SQLAlchemy을 이용해 작성한 쿼리가 우리가 원하는 쿼리와 같은지 확인해보자.

from sqlalchemy.orm import sessionmaker
from sqlalchemy import and_, or_


_session = sessionmaker()
with _session.begin() as session:
	query = (
		session
		.query(Calendar)
		.filter(
			or_(
				and_(Calendar.year == 2021, Calendar.month == 12),
				and_(Calendar.year == 2022, Calendar.month == 1,
			)
		)
	)

	print(query)

"""
SELECT calendar.year AS calendar_year,
	   calendar.month AS calendar_month,
	   calendar.day AS calendar_day 
FROM calendar 
WHERE calendar.year = :year_1
AND calendar.month = :month_1
OR calendar.year = :year_2
AND calendar.month = :month_2
"""

SQL Query를 그대로 옮겼음에도 불구하고 SQLAlchemy로 만들어진 Query의 WHERE 구문에 괄호가 적용되지 않아 원하는 결과가 나오지 않는 것을 예상할 수 있다. 이러한 문제는 괄호로 묶어줘야 할 부분에  `.self_group()` 메소드를 추가하여 해결할 수 있다.

with _session.begin() as session:
	query = (
		session
		.query(Calendar)
		.filter(
			or_(
				and_(Calendar.year == 2021, Calendar.month == 12).self_group(),
				and_(Calendar.year == 2022, Calendar.month == 1.self_group(),
			)
		)
	)

	print(query)
 
"""
SELECT calendar.year AS calendar_year,
	   calendar.month AS calendar_month,
	   calendar.day AS calendar_day 
FROM calendar 
WHERE (calendar.year = :year_1 AND calendar.month = :month_1)
OR (calendar.year = :year_2 AND calendar.month = :month_2)
"""

잘못된 내용, 오타, 부정확한 문장 등 어떤 피드백이든 환영합니다. 감사합니다.


저작자표시 비영리 변경금지 (새창열림)

'Data' 카테고리의 다른 글

Alembic. 버전 관리 테이블이 생성될 스키마 지정하기  (0) 2023.09.03
SQLAlchemy. CASE WHEN 구문 with Label  (0) 2023.09.02
Alembic. 동적으로 DB 접속 정보 만들기  (0) 2023.09.02
    'Data' 카테고리의 다른 글
    • Alembic. 버전 관리 테이블이 생성될 스키마 지정하기
    • SQLAlchemy. CASE WHEN 구문 with Label
    • Alembic. 동적으로 DB 접속 정보 만들기
    Tigris
    Tigris
    Data Science, Data Engineering, 그리고 Data Product와 관련된 이야기를 함께 나누고 싶습니다.

    티스토리툴바