파이썬 중복 저장 방지: SQLite UNIQUE와 UPSERT 사용법
중복 저장을 막으려면 업무상 같은 항목을 식별하는 키를 정하고, 데이터베이스의 UNIQUE 제약과 저장 정책을 함께 사용해야 합니다. 파이썬에서 존재 여부를 미리 조회하는 것만으로 동시 저장의 중복까지 막을 수는 없습니다.
무엇을 중복으로 볼지 먼저 정하세요
제목이 같다고 같은 문서는 아닐 수 있습니다. 원본 서비스의 고유 ID가 있다면 우선 사용하고, 없다면 URL 정규화나 여러 필드의 조합을 검토하세요. 제목과 날짜의 해시값도 원본 필드가 같거나 충돌하면 같은 키가 될 수 있으므로 업무상 유일성을 보장하는 별도 근거가 필요합니다.
SQLite로 재현하는 중복 방지 예제
Python 3 표준 sqlite3 모듈만 사용합니다. 메모리 DB를 사용하므로 실제 파일을 바꾸지 않습니다. 같은 원본 ID가 들어오면 해당 행의 내용을 갱신하는 정책입니다.
import sqlite3
con = sqlite3.connect(":memory:")
try:
con.execute("""CREATE TABLE articles (
source_id TEXT PRIMARY KEY NOT NULL,
title TEXT NOT NULL
)""")
sql = """INSERT INTO articles(source_id, title) VALUES (?, ?)
ON CONFLICT(source_id) DO UPDATE SET title=excluded.title"""
with con:
con.execute(sql, ("A01", "첫 제목"))
con.execute(sql, ("A01", "수정된 제목"))
rows = con.execute("SELECT source_id, title FROM articles").fetchall()
assert rows == [("A01", "수정된 제목")]
print(rows)
finally:
con.close()
최종 결과는 한 행입니다. 기존 값을 보존하고 새 입력을 무시해야 한다면 DO NOTHING 정책을 검토할 수 있습니다. 갱신이 필요한 자료에 무조건 중복 무시를 적용하면 내용 변경을 놓치게 됩니다.
예외를 전부 중복으로 취급하지 마세요
무결성 오류에는 UNIQUE 위반 외에 NOT NULL이나 외래키 위반도 포함될 수 있습니다. 예외를 모두 “중복이므로 건너뜀”으로 바꾸면 잘못된 자료가 사라져도 알 수 없습니다. 가능한 충돌 대상을 SQL에 명시하고 그 밖의 오류는 별도로 기록하세요.
운영에 적용할 때
기존 테이블에 제약을 추가하기 전에는 중복 자료를 먼저 조사하고 백업해야 합니다. 여러 행의 처리 단위를 트랜잭션으로 정하고, 입력 건수·저장 건수·갱신 건수를 비교하세요. DB마다 UPSERT 문법과 동시성 동작이 다르므로 사용하는 DB의 문서를 확인해야 합니다.
공식 자료: Python sqlite3, SQLite UPSERT. 관련 글: SQLite 기초, 입력 JSON 검증, 데이터 처리 가이드.
작성: 로그 · 2026-10-17 수정: 유일 키와 갱신 정책을 구분하고 재현 가능한 예제를 추가했습니다.
댓글
댓글 쓰기