본문 바로가기

[교대근무 관리프로그램] 관리프로그램 구현을 위한 FASTAPI - CRUD편- 월별, 연도별 데이터만 가져오기, 요일 구분하기 , in 사용법

ironwhale 2022. 10. 4.

이번 프로젝트에서 백엔드로는 FASTAPI를 사용하였습니다.  CRUD를 구현을 위해 저는 SQLALchemy를 사용하여 연도와 월을 입력하면 해당 연도의 그 월의 자료만 가져올 수있는 기능(extract)과 날짜를 입력하면 요일(dayofweek,weekday

)을 구분하는 기능 구현이 필요하였습니다. 아울러 or 대신 카테고리 데이터 유무를 판단할 수있는 in사용법도 알아보겠습니다. 

 

요일 구분하는 기능 

우선 쉬운 요일 구분하는 기능부터 알아보겠습니다. 요일을 구분하는 함수는 여러가지가 있지만 요일을  숫자로 구분하고 있습니다.  

파이썬 datetime의 요일구분 

파이썬의 datetime 라이브러리의 date.weekday(날짜) 함수에서는 월=0, 화=1로 구분하고 있습니다.

from datetime import date

## 요일 구분 5=토요일 6=일요일
date.weekday(work.mdate)==5 or date.weekday(work.mdate)==6

sqlalchemy.func.dayofweek()의 요일 구분 

SQLALchemy에도 요일 구분하는 함수가 있습니다. 여기서는 월=1, 화=2로 구분하고 있습니다. 이것은 date.isoweekday()와 같습니다. 

    stmt = select(models.MemberShift)\
           .where((extract("year",models.MemberShift.mdate)==year) \
           & (extract("month",models.MemberShift.mdate)==month)).\
           where((func.dayofweek(models.MemberShift.mdate)==6) \
           | (func.dayofweek(models.MemberShift.mdate)==7))\
          .where(models.MemberShift.status.in_(["D","N"]))\
           .order_by(models.MemberShift.mdate, models.MemberShift.person)
    
    
    members = db.execute(stmt).scalars().all()

 연도별, 월별 데이터만 추출하기 

교대근무표 중에서 2022년 8월 데이터만 추출하고 싶습니다. 물론 between이나 부등식을  사용할 수도 있지만 저는 연도와 월을 입력하면 해당 연월의 데이터를 가지고 오는 다른 방법을 찾았습니다. 바로 extract를 이용한 방법입니다. 

 

날짜 정보 추출함수(extract) 사용

extract("year", 날짜) == "2022" 이면 2022년의 데이터만 가지고 올 수있습니다. 같은 방식으로 and를 사용하여 extract("month", 날짜) == "8" 을 쓰면 2022년 8월의 데이터만 가지고 올 수있습니다. 

 

or 대신 사용 가능한 in 구문

A or B or C or D 이렇게 쓰면 정말 가독성이 떨어집니다. 그래서 SQL에서는 IN을 사용합니다. SQLALChemy에서는 아래와 같이 사용합니다. 컬럼명.in_([리스트]) 와 같이 사용하면 됩니다. 

models.MemberShift.status.in_(["D","N"])

댓글