cursor.lastrowid
한 줄 정의
직전에 INSERT된 row의 Primary Key(rowid)를 반환한다.
언제 쓰나
단일 PK + auto increment 테이블에서 INSERT 후 생성된 id를 알아낼 때 쓴다. DB가 id를 자동 생성하기 때문에 INSERT 전에는 id를 알 수 없는 상황이다.
cursor.execute("INSERT INTO jobs (name, status) VALUES (?, ?)", ("crawl", "pending"))
job_id = cursor.lastrowid # → DB가 자동 생성한 id, 예: 42
SQLite 내부 동작
SQLite는 모든 테이블에 내부적으로 rowid라는 64bit 정수를 숨겨서 관리한다. INTEGER PRIMARY KEY 단일 PK는 이 rowid의 alias라서 lastrowid가 정확히 동작한다.
Composite PK에서는?
Composite PK는 rowid와 매핑이 안 되기 때문에 lastrowid가 의미 없다. 근데 애초에 필요한 상황도 잘 안 생긴다. Composite PK 테이블은 값을 직접 지정해서 INSERT하기 때문에 넣은 값을 이미 알고 있다.
job_id, tag_id = 3, 7
cursor.execute("INSERT INTO job_tags VALUES (?, ?)", (job_id, tag_id))
# lastrowid 쓸 필요 없음
주의사항
INSERT 직후에 읽어야 한다. 다른 쿼리를 실행하면 값이 바뀌거나 None이 될 수 있다. INSERT가 실패했을 때도 None을 반환하므로 체크하는 게 안전하다.
cursor.execute("INSERT INTO jobs ...")
job_id = cursor.lastrowid
if job_id is None:
raise RuntimeError("INSERT 실패")