직장인은 정말 바쁘군요 (*´﹃`*)
CRM - Braze/Amplitude 에 Daily Batch 로 전송하는 코드에 있어 속성 추가 작업을 진행 중인데요! 내일 (목요일) 까지 DB 테이블에 1차 저장하는 add_batch, CRM 에 전송하는 send_batch 모두 끝내는 것이 목표입니다.
현재 총 20개의 추가 속성 요청을 전달받았는데, 이제 하나만 작업하면 됩니다! ୧(´ᴗ`)୨
물론 DB Table 저장 전, add_batch 코드에서 DB 데이터 collect 하는 과정만 완성되는 거긴 하지만요....ㅎㅎ;;;;
어찌됐든 ORM - SQLAlchemy 에 익숙해지는 것은 어렵네요 ㅠ.ㅠ MySQL 버전 문제로 Window 함수를 사용할 수 없는 상태여서 (ㅎㅎ...?) 서브쿼리를 이용할 수 밖에 없는 환경이라... ORM 으로 하려니 머리가 아프네요 ㅋㅋㅋ (그래서 일단은 SQL 문 작성해서 execute 로 통으로 쿼리하는 중입니다 ㅎ)
그래도 이것저것 테스트하면서 익숙해지는 중입니다!

일단 현재는 마지막 추가 속성 관련해서 기존 회사 코드 흐름을 파악했고, 이를 바탕으로 어떻게 하면 효율적인 Query 를 작성할 수 있을지 고민하는 단계입니다! 그래도 4일간 이리저리 쿼리 생각하면서 조금은 익숙해진 점은 뿌듯하네요 ♪ ( ᷇࿀ ᷆ و(و "
# SQL 문 관련 시도 (쿠폰 일부)
[1] 처음에 작성한 코드 (3/21 월요일)
# Write down the numbers in order of the latest date. (Group by user.)
coupon_subquery = self.r_session.query(
Coupon_A.id.label('id'),
func.count().label('row_number')
).join(
Coupon_B, and_(Coupon_A.member_id == Coupon_B.member_id, Coupon_A.created_at <= CouponUse_B.created_at)
).filter(
Coupon_A.member_id.in_(user_id_list),
Coupon_A.is_deleted == 0,
cast(Coupon_A.created_at, Date) >= standard_dt
).group_by(
Coupon_A.member_id,
desc(Coupon_A.created_at)
).subquery()
# Get only the latest coupon information.
total_coupon_list = self.r_session.query(
Coupon
).join(
coupon_subquery, and_(Coupon.id == coupon_subquery.c.id)
).filter(
coupon_subquery.c.row_number == 1
).order_by(
Coupon.member_id
).all()
[2] execute 작성한 코드 (3/22 화요일) - Workbench 돋보기 사용 시 성능 2배 향상된 쿼리
def _get_coupon_stmt(self, user_id_list, standard_dt):
return f"""
SELECT *
FROM (
SELECT *, (
SELECT count(*)
FROM coupon b
WHERE a.userkey = b.userkey AND a.date_time <= b.date_time
AND b.is_deleted = 0 AND cast(b.date_time as Date) >= {standard_dt}
) as row_num
FROM coupon a
WHERE a.userkey in ({(','.join(str(user_id) for user_id in user_id_list))}) AND a.is_deleted = 0
AND cast(a.date_time as Date) >= {standard_dt}
ORDER BY userkey, date_time desc
) as new_coupon
WHERE new_coupon.row_num=1;
"""
현재 SQLAlchemy 로 Scalar Subquery 어떻게 조합하는지 모르는 상태.
From 절 Subquery 또는 join 에서의 서브쿼리 활용은 찾아낸 상태.
=> 차장님이 어쩔 수 없는 경우가 아닌 이상 execute 방식은 사용하지 말라고 하셨음.
=> 그래도 일단 기능은 돌아가게 만들어 놓고 내일 검토하면서 리팩토링 생각해보자. (일단 마감이 중요)
'Learn > Company' 카테고리의 다른 글
[TIL #23] 질문봇이 된 날 (0) | 2022.04.08 |
---|---|
[TIL #22] 3월 회고 & 4월 목표 (2) | 2022.04.05 |
[TIL #20] CRM 속성 추가하기 (본격적인 업무 시작!) (0) | 2022.03.19 |
[TIL #19] 코드 구조 파악하기 (0) | 2022.03.15 |
[TIL #18] 구글 환불 API 구현 + Flask 프레임워크 공부 (0) | 2022.03.09 |