원문: https://simonwillison.net/2026/Jul/11/sqlite-utils/ 발행일: 2026-07-11 번역일: 2026-07-12
며칠 전 4.0 이후 첫 마이너 릴리즈로, 여러 가지 소소한 신규 기능들이 추가되었다.
sqlite-utils insert와sqlite-utils upsert에--code옵션이 추가되었다. 파일에서 가져오는 대신,rows()함수나rows이터러블을 정의하는 Python 코드 블록을 직접 입력하거나.py파일 경로를 지정할 수 있다. (#684)
sqlite-utils는 이미 CLI 인수로 Python 코드 블록을 전달하는 기능을 갖추고 있었다. 예를 들어 sqlite-utils convert 명령에서는 이런 식으로 사용할 수 있다:
sqlite-utils convert content.db articles headline '
def convert(value):
return value.upper()'
코드 블록으로 새로운 행을 직접 생성하는 것은 이 패턴의 자연스러운 확장이었다:
sqlite-utils insert data.db creatures --code '
def rows():
yield {"id": 1, "name": "Cleo"}
yield {"id": 2, "name": "Suna"}
' --pk id
sqlite-utils insert와sqlite-utils upsert에--type 컬럼명 타입옵션이 추가되었다. 테이블 생성 시 자동으로 선택된 타입을 재정의할 수 있다. 정수처럼 보이지만 앞자리 0을 보존하기 위해 TEXT로 저장해야 하는 우편번호 같은 CSV/TSV 컬럼에 유용하다. (#131)
오래된 기능 요청이었는데, 알고 보니 구현이 간단했다.
-
table.drop_index(name)메서드와sqlite-utils drop-index커맨드가 새로 추가되었다. 인덱스를 이름으로 삭제할 수 있으며, 두 가지 모두 누락된 인덱스를 무시하는ignore=True/--ignore옵션을 지원한다. (#626) -
sqlite-utils query가 이제 쿼리 자리에-를 전달하면 표준 입력에서 SQL 쿼리를 읽을 수 있다. 예:echo "select * from dogs" | sqlite-utils query dogs.db -. (#765)
소소한 기능 두 가지를 더 추가했다. Codex로 모든 열린 이슈를 검토해서 가장 쉬운 것들을 추려냈다!
sqlite-utils upsert가 이제 기존 테이블의 기본 키(Primary Key)를 자동으로 추론할 수 있어, 이미 기본 키가 있는 테이블에 upsert할 때--pk를 생략할 수 있다.
이것도 Codex의 제안이었다. 4.0 릴리즈에서 Python 라이브러리에 개선된 기능이 CLI에는 빠져 있었던, 명백한 누락이었다.
-
table.transform()과table.transform_sql()이 이제strict=True또는strict=False를 받아 테이블의 SQLite strict mode를 변경할 수 있다. 옵션을 생략하면 기존 모드가 유지된다. (#787) -
sqlite-utils transform커맨드에도--strict와--no-strict옵션이 추가되어 테이블의 strict mode를 변경할 수 있다. (#787)
이 두 가지는 Evan Hahn이 쓴 Prefer STRICT tables in SQLite에서 영감을 받았다. 오늘 Hacker News에서 화제가 된 글이다. Evan은 이런 점을 지적했다:
"안타깝게도 ALTER TABLE로 테이블을 strict로 만드는 방법은 없는 것 같다. non-strict 테이블에서 strict 테이블로 데이터를 복사해야 할 것이다."
그게 바로 sqlite-utils transform 메커니즘이 하는 일이다. 그래서 테이블을 strict에서 non-strict로, 또는 그 반대로 전환하는 기능을 추가하도록 확장했다.
새로운 strict 테이블 기능을 구현할 때 사용한 GPT-5.6 Sol xhigh Codex 대화록도 공유한다. 가장 유용했던 프롬프트 중 하나는 이것이었다:
"uv run python -c를 써서 새로운 .transform(strict=) 옵션을 직접 실행해보고, 엣지 케이스나 버그를 찾을 수 있는지 확인해봐."
모델에게 이미 작성한 자동화 테스트 외에도 자신의 작업을 수동으로 테스트하도록 한 것이다. 이로 인해 사소한 문제 두 가지가 발견되어 수정했다.
핵심 요약 (20줄)
- sqlite-utils 4.1 출시 — 4.0 이후 첫 마이너 릴리즈, 소소하지만 실용적인 신규 기능 다수 추가
--code옵션 — insert/upsert 시 Python 코드 블록 또는 .py 파일로 행(row) 직접 생성 가능--type옵션 — CSV/TSV 삽입 시 컬럼 타입을 수동 지정 (우편번호처럼 정수 같지만 TEXT여야 하는 경우)drop_index추가 — 인덱스를 이름으로 삭제하는 메서드 및 CLI 명령 신규 추가,--ignore옵션 지원- 표준 입력(stdin) 쿼리 —
sqlite-utils query dogs.db -형태로 파이프로 SQL 전달 가능 - upsert Primary Key 자동 추론 — 기존 테이블에 upsert 시
--pk생략 가능 - SQLite Strict Mode 전환 —
table.transform(strict=True/False)로 strict 모드를 런타임에 변경 가능 - CLI strict 옵션 —
sqlite-utils transform --strict / --no-strict로 strict 모드 전환 - Evan Hahn 글에서 영감 — "ALTER TABLE로 strict 불가" 한계를 transform 메커니즘으로 해결
- Codex 활용 — 오픈 이슈를 Codex로 분석해 구현하기 쉬운 것들을 추려 빠르게 처리
- GPT-5.6 Sol xhigh 사용 — strict 기능 구현에 AI 코딩 어시스턴트를 적극 활용
- 수동 테스트 프롬프트 — "uv run python -c로 직접 테스트해서 엣지 케이스 찾아봐" 프롬프트가 효과적
- 자동 테스트 + 수동 검증 — AI가 작성한 자동 테스트 외 수동 실행으로 2개 버그 추가 발견
- sqlite-utils 생태계 — Simon Willison의 Datasette 주변 도구로, SQLite를 Python에서 쉽게 다루는 CLI/라이브러리
- 이슈 #131 — 3년 이상 방치된 타입 지정 이슈, 구현이 간단해 이번에 해결
- stdin 파이프 지원 — Unix 철학에 맞는 도구 연계 기능 강화
--pk생략 — upsert 편의성 개선, 이미 PK가 있는 테이블에는 불필요한 반복 제거- strict mode 의미 — SQLite STRICT 테이블은 컬럼 타입을 엄격하게 강제해 데이터 무결성 향상
- transform 메커니즘 — strict ↔ non-strict 변환은 내부적으로 데이터를 새 테이블로 복사하는 방식
- 실용적인 릴리즈 철학 — AI 도구로 이슈를 빠르게 훑고, 사용자 피드백 기반의 작고 의미있는 개선을 지속 배포