데이터 라이프 사이클 때문에 매일 90일 이전의 데이터를 특정 컬럼만 null로 업데이트 하는걸 구현했습니다
문제는 건수가 많아서 한번에 update해서 commit하는게 아니라
루프로 돌려서 1만건update하고 commit 하는걸 만드려는데 잘 안되네요 ㅠㅠㅠ
if updt_cnt > 10000:
loop_count = updt_cnt // 10000 + 1
log.info(f"Number of times to loop: {loop_count}")
for loop_count in range(loop_count):
qry = """
BEGIN TRANSACTION;
"""
for loop_count in range(10000):
updt_qry = row[3]
conn['curs'].execute(updt_qry)
qry += """
commit;
"""
conn['curs'].execute(qry)
conn['conn'].commit()
log.info(updt_qry)
update 커맨드에서 멈춰있어요 ㅠㅠ 어떻게 해야할까요 ㅠㅠㅠ
row[3]은 위에 update문 추출하는 쿼리 정의 한거에요
sql_updt_qrylist = """
SELECT
CONCAT('update da.dlc_col_updt_mgt set updt_dttm=NOW() where db_name=''', db_name, ''' and table_name=''', table_name, '''') AS updt_dttm_qry,
CONCAT('update da.dlc_col_updt_mgt a, (select count(*) as updt_cnt from ', db_name, '.', table_name, ' where ', updt_col, ' ', updt_purge, ')b set a.updt_cnt=b.updt_cnt where a.table_name=''', table_name, '''') AS updt_cnt_qry,
updt_cnt,
CONCAT('update ', db_name, '.', table_name, ' set ',
GROUP_CONCAT(CONCAT(col_name, '=', updt_val) SEPARATOR ' ,'), ' where ', updt_col, ' ', updt_purge) AS updt_qry,
CONCAT('update da.dlc_col_updt_mgt set rslt_dttm=NOW() where db_name=''', db_name, ''' and table_name=''', table_name, '''') AS rlst_dttm_qry
FROM da.dlc_col_updt_mgt
WHERE use_yn = 'Y'
GROUP BY db_name,
table_name,
updt_val,
updt_col,
updt_cnt,
updt_purge;
위 쿼리에서 4번쨰 컬럼이 update문 추출하는쿼리인데 그걸 수행하게하려는 거에요
하나의 테이블의 여러 항목을 하나의 문장으로 갱신하는게 아니라
각 항목마다 갱신쿼리가 따로 작동하는 듯 합니다.
GROUP BY 에서 updt_val 을 제거하세요.
어떤 말씀이신지 ㅠㅠ 저 쿼리문자체는 제가 의도한데로 update문을 기간 조건으로 넣어서 잘 나오는데
ex)update ~~~ where 기간 between ~~and ~~
이 업데이트 문에 건수가 2만건이 넘거든여 이걸 한번에 업데이트가아니구 10000건씩 루프돌려서 10000건 업데이트하고 커밋 다음루프에 10000건 업뎃하고 커밋
이렇게 구현이 하고싶은거에여 ㅠ
예를 들면 t1 이라는 테이블에 특정 조건으로 c1, c2, c3 를 각각 업데이트 하는 경우에
UPDATE t1 SET c1 = 1, c2 = 2, c3 = 3 WHERE c4 = 4
이와 같이 되야 할 것 같은데
다음과 같이 3번에 나누어서 수행되는 구조입니다.
UPDATE t1 SET c1 = 1 WHERE c4 = 4;
UPDATE t1 SET c2 = 2 WHERE c4 = 4;
UPDATE t1 SET c3 = 3 WHERE c4 = 4;