사실상 업무용 DB를 구글 스프레드 시트에 백업하고 쓰는 구조를 갖다보니 sheet api의 제약사항에 굉장히 민감해질 수 밖에 없다. athena에 쿼리해서 데이터를 불러오고 다시 구글 시트의 내용을 불러오고 밀어넣는 과정에서 api limit에 걸리면서 오류가 나는 경우가 많다. 특히 최근에는 여러 데이터를 하나의 시트에 동시다발적으로 밀어넣어서 더 그랬던 것 같다.
다른 시트는 row가 하나인 것에 비해 특정 시트는 하루에 여러개의 데이터가 여러 row로 들어가서 문제가 자주 발생했는데 하나의 라인을 업데이트 하는 방식이 아닌 append_rows에 여러개의 line 리스트를 넣었다.
report_line = [dateFormula, 1, 2, 3, 4, 5]
기존에 이런 report_line을 for loop에서 여러번 입력하는 방식을 썼다면 지금은 아래처럼 리스트를 한번 더 묶어서 업데이트할 데이터를 미리 준비해두었다.
report_line_list = []
for data in datas:
report_line = [dateFormula, 1, 2, 3, 4, 5]
report_line_list.append(report_line)
그리고 업데이트 할 데이터가 모두 report_line_list에 들어가면 아래와 같은 코드를 추가로 실행해서 시트를 한번에 업데이트 하도록 했다.
sheet.append_rows(values=report_line_list)
row_num = len(sheet.col_values(1))
cell_list = sheet1.range('A1:A{}'.format(row_num))
sheet.update_cells(cell_list, value_input_option='USER_ENTERED')
cell_list는 날짜가 있는 부분이고 value_input_option에 'USER_ENTERED'를 넣음으로써 =(DATE("%Y,%m,%d")) 가 날짜 형식으로 입력될 수 있도록 했다.
시간을 낼 수 없어서 급한대로 time.sleep을 for loop 전에 10초, for문 돌면서 3초씩 멈췄다가 하도록 해놨었는데 3~4분 걸리던 작업이 이렇게 하니 limit에 걸리지도 않고 깃헙 액션에서 1분만에 돌아갔다. (시간을 핑계로 꼼수를 쓰지 말자.. 스파게티 된다.)
'코드와 오류 기록' 카테고리의 다른 글
SQL timezone 변경하기 (0) | 2021.10.19 |
---|---|
github 토큰 만료 후 재인증 안되는 문제 해결 (0) | 2021.09.23 |
자주 사는 물건 매일 가격보기 (0) | 2021.09.09 |
파이썬 매월 시작일(공휴일 무시) 간단하게 만들기 (0) | 2021.08.25 |
파이썬 특정 기간의 날짜 for문 돌리기 (0) | 2021.08.25 |