루프를 Python이 아니라 C에서 돌려
executemany는 SQL statement 하나와 parameter tuple을 순회할 수 있는 것 하나를 받아. 그러면 드라이버가 C 쪽에서 루프를 돌면서 준비해둔 statement를 재사용해. 대량으로 넣을 때는 Python for 루프에서 row마다 execute를 부르는 것보다 훨씬 빨라. transaction 하나와 짝지으면 궁합도 자연스럽고.
규칙은 셋이야.
- row를 100개 이상 쓸 거면 언제나 이걸 써.
with conn:으로 transaction 안에 넣어.- 덩치가 아주 크면 1천에서 1만 row씩 잘라. 메모리와 락 잡는 시간을 적당히 유지하려고.
Tip: executemany와 transaction의 조합이 대개 'insert가 느리게 느껴진다'와 'insert가 공짜처럼 느껴진다'를 가르는 선이야. SQLite가 느리다는 제보의 가장 흔한 원인이 transaction을 안 걸어서거든.