ai-coding-mines목차GitHub

잘못된 일괄 변환은 역연산으로 복구되지 않는다 — 정본에서 다시 긁어라

Python · DB

증상

/100으로 잘못 나눈 레코드를 "복구했다"고 기록해 두었다. 엿새 뒤, 다른 스토어 103건이 여전히 잘못된 값으로 남아 있었다.

원인

복구는 같은 오판이 적용된 범위 전체가 아니라 처음 발견한 스토어에만 들어갔다. ★★★ 일괄 변환의 적용 범위를 모르면 복구의 범위도 모른다.

★★★ 그리고 ×100으로는 못 되돌린다

나눈 걸 곱하면 될 것 같지만 안 된다.

  1. 어느 레코드가 변환됐는지 기록이 없다 — 대상을 특정할 수 없으면 역연산도 못 건다
  2. 부분 적용 — 일부만 변환됐다. 전량 ×100멀쩡한 레코드를 망가뜨린다(같은 실수의 반복)
  3. 그 사이 다른 갱신이 섞였다 — 재수집·재계산이 끼면 지금 값은 변환 직후 값이 아니다
  4. 반올림 손실 — 나누고 곱해도 원값이 안 돌아온다

해법

백업이 아니라 정본에서 전량 재수집한다.

row["twd"] = live[handle]      # 역연산이 아니라 재작성

★★ 정본이 외부 시스템에 있다면 그것이 최선의 백업이다. 우리 백업은 시점이 섞이지만 원천 API는 지금 이 순간의 정답이다. 로컬 사본을 수선하려 들지 말고 버리고 다시 받아라.

★ 일괄 변환의 규약

  1. 대상 목록을 파일로 먼저 남긴다. 그게 유일한 복구 수단이다
  2. 변환 전 값을 같은 레코드의 다른 필드에 남긴다(twd_raw) — 역연산보다 확실하다
  3. ★★ "복구 완료"는 전건 재조회로 확인한다. 같은 실수가 다른 대상에도 있었는지까지 센다

★★★ 되돌릴 수 있다고 생각한 쓰기가 비가역이었다. "복구 가능"이라는 판단 자체가 적용 범위를 안다는 가정에 기대고 있었고, 그 가정이 틀렸다.