파이썬 SQLite 두 테이블 저장: 두 번째 INSERT 실패 시 함께 롤백하기
함께 성공해야 하는 INSERT를 같은 연결의 트랜잭션으로 묶고, 예외를 with 블록 밖에서 처리하세요. 확인일: 2026-10-25. Python 3.14 표준 라이브러리 예제이며, Windows Python 3.14.4에서 합성 입력으로 실행하고 assert 검사를 통과했습니다. 두 번의 저장이 하나의 작업이어야 하는 이유 자료 본문을 items에 넣고 처리 이력을 job_events에 따로 넣는 자동화를 생각해 보세요. 첫 저장 뒤 commit하고 이력 저장이 실패하면 본문만 남을 수 있습니다. 이 글은 중복 항목을 갱신하는 UPSERT가 아니라, 서로 연결된 두 저장의 성공·실패 경계를 맞추는 방법을 다룹니다. 예제는 메모리 DB와 가상 문서만 사용합니다. 예제의 입력과 실패 조건 items의 id와 job_events의 job_id는 각각 기본 키입니다. 첫 호출은 A01과 job-1을 저장합니다. 다음 호출은 새 문서 B02를 넣은 뒤 이미 있는 job-1을 또 저장해 두 번째 INSERT에서 IntegrityError가 나도록 구성했습니다. 예상 결과는 A01과 첫 이력만 남고 B02는 없는 것입니다. SQL 값은 문자열 보간 대신 자리표시자로 전달합니다. 직접 실행하는 예제 import sqlite3 def save_item(conn, item_id, name, job_id): with conn: conn.execute("INSERT INTO items VALUES (?, ?)", (item_id, name)) conn.execute("INSERT INTO job_events VALUES (?, ?)", (job_id, item_id)) conn = sqlite3.connect(":memory:", autocommit=False) try: conn.execute("CREATE TABLE items (id TEXT PRIMARY KEY, ...