파이썬 코드좀 봐주세요 ㅠㅠㅠㅠㅠ 0 3 5,454

by 뜨디 [MySQL] mysql 파이썬 python [2024.07.16 19:04:58]


데이터 라이프 사이클 때문에 매일 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문 추출하는쿼리인데 그걸 수행하게하려는 거에요

by 마농 [2024.07.17 08:39:41]

하나의 테이블의 여러 항목을 하나의 문장으로 갱신하는게 아니라
각 항목마다 갱신쿼리가 따로 작동하는 듯 합니다.
GROUP BY 에서 updt_val 을 제거하세요.


by 뜨디 [2024.07.17 13:26:32]

어떤 말씀이신지 ㅠㅠ 저 쿼리문자체는 제가 의도한데로 update문을 기간 조건으로 넣어서 잘 나오는데

ex)update ~~~ where 기간 between ~~and ~~ 

이 업데이트 문에 건수가 2만건이 넘거든여 이걸 한번에 업데이트가아니구 10000건씩 루프돌려서 10000건 업데이트하고 커밋 다음루프에 10000건 업뎃하고 커밋 

이렇게 구현이 하고싶은거에여 ㅠ


by 마농 [2024.07.19 08:52:42]

예를 들면 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;

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입