What I Learn Today

Start Date : 2022/02/07 ~

Learn/Company

[TIL #21] 열심히 업무 중! CRM 배치 속성 추가하기

HannaDev 2022. 3. 23. 23:41

직장인은 정말 바쁘군요 (*´﹃`*)

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 방식은 사용하지 말라고 하셨음.

=> 그래도 일단 기능은 돌아가게 만들어 놓고 내일 검토하면서 리팩토링 생각해보자. (일단 마감이 중요)