요약
apsw는 Python에서 SQLite의 기능을 빠짐없이 쓰게 해 주는 래퍼 라이브러리입니다.
개발자 로저 빈스가 만든 오픈소스 프로젝트입니다. SQLite C API 전체를 Python에서 쓸 수 있게 감싸는 것이 목표이고, 새 SQLite 릴리스가 나오면 계속 따라갑니다.
왜 중요한가
- 표준 라이브러리 sqlite3는 다른 데이터베이스와 바꿔 쓰기 쉽게 만든 탓에 SQLite 고유 기능이 가려집니다.
- apsw는 SQLite를 있는 그대로 드러내므로, SQLite만 쓸 개발자에게 더 맞는 선택지가 됩니다.
핵심 내용
- DBAPI(여러 DB를 같은 방식으로 다루는 Python 표준 규격)를 따르지 않고 SQLite의 동작을 그대로 노출합니다.
- sqlite3처럼 SQL을 몰래 고쳐 트랜잭션을 관리하지 않고, 중첩 트랜잭션(세이브포인트)을 지원합니다.
- 전문 검색(FTS5), 세션 확장, 가상 테이블, VFS(가상 파일 시스템), JSONB 같은 기능을 모두 쓸 수 있습니다.
- 콜백에서 난 예외를 삼키지 않고, SQLite 오류 코드마다 예외를 따로 둬 디버깅이 쉽습니다.
- PyPI 배포판은 SQLite를 함께 묶어 시스템의 SQLite와 충돌하지 않으며, Python 3.10 이상을 지원합니다.
HN 반응
- 여러 이용자가 sqlite3의 트랜잭션 처리와 별난 동작에 지쳐 apsw로 옮겼다며, SQLite를 제대로 쓰려는 사람의 라이브러리라고 평했습니다.
- DBAPI를 따르는 sqlite3로도 엔진 교체는 쉽지 않다는 보충이 있었고, PostgreSQL 코드를 옮기며 매개변수 변환기를 따로 짰다는 경험담도 나왔습니다.
한 문장으로 말하자면 apsw는 "SQLite를 사랑하는 사람을 위한 SQLite 라이브러리"입니다. 파이썬 표준 라이브러리 쪽은 범용 인터페이스("DBAPI")를 제공하려고 합니다. 나중에 다른 데이터베이스 엔진으로 갈아타고 싶을 때는 좋지만, SQLite의 성능과 기능을 제대로 끌어내기에는 좋지 않습니다.
다른 엔진으로 바꾸는 데도 그다지 좋지 않습니다.
저는 보통 postgres를 씁니다(SQLite보다 함수가 마음에 들어서요). 그런데 최근에 만든 작은 프로그램은 좀 더 자기완결적으로 만들고, 원하면 sqlite DB도 쓸 수 있게 하면 좋겠다고 생각했습니다. SQL 문법 차이는 일단 제쳐 두더라도(말씀드렸듯이 저는 postgres의 함수 때문에 쓰니까 차이가 정말 많았습니다), sqlite는 파라미터 표기 방식이 다릅니다. 그래서 psycopg3 스타일의 "%(name)s"를 sqlite3의 ":name"으로 바꿔 주는 자동 변환기를 짜야 했습니다. 또 저는 (아마도 나쁜 습관이겠지만) 연결을 열어 둔 채 커서에 컨텍스트 매니저를 쓰곤 했는데, sqlite는 이걸 싫어하고 컨텍스트 매니저를 연결에 쓰기를 원합니다. 마지막 관문은 행 결과를 dict로 받는 것이었습니다. psycopg도 기본값은 아니라서 그리 중요한 문제는 아니지만, sqlite3에서는 손이 조금 더 갑니다.
그러니 데이터베이스를 교체 가능하게 만드는 일은 가능합니다. 하지만 dbapi가 있어도 간단하지는 않습니다.
왜 안 좋다고 하시는 거죠?
트랜잭션과 관련된 전부요. 중첩 트랜잭션도 포함해서요.
이걸 쓰기 편한 API로 쓰고 싶은 분들을 위해 알려 드립니다. 얼마 전에 sqlite-utils를 apsw로 포팅했습니다. https://github.com/AnswerDotAI/apswutils
지난 1~2년간 많이 써 왔는데 아주 잘 동작했습니다.
이 라이브러리는 훌륭하고, 최근에 제 프로젝트를 구해 주기도 했습니다. 파이썬 sqlite3의 몇몇 별난 동작이 어떻게 돌아가는지 알아내려면 너무 번거로웠는데, 이쪽은 대체로 제 예상대로 그냥 동작했습니다. 이 경험 때문에 다른 프로젝트에서도 sqlite3 대신 이걸 기본으로 쓰기 시작했습니다.
(이 문서 페이지에 라이브러리의 취지가 설명되어 있습니다. https://rogerbinns.github.io/apsw/pysqlite.html )
sqlite3에서 어떤 별난 동작을 겪으셨어요?
APSW를 써 보고 있는데, 쿼리가 행을 하나도 반환하지 않으면 커서에서 컬럼 이름을 가져오기가 어렵더라고요. 이럴 때 권장되는 방법이 있을까요?
해커뉴스 덕분에 새로운 것을 배웠습니다. 다음 SQLite 프로젝트에는 APSW를 쓰겠습니다. 감사합니다.
훌륭한 래퍼이긴 한데, 연도를 붙여야 하지 않나요? 딱히 새로운 건 아니잖아요.
마지막 커밋이 1시간 전인데요.
아, 나온 지는 꽤 됐지만 날짜 표기 관례는 저장소가 아니라 기사에 해당하는 건가 보네요.
방치된 프로젝트네요!
많은 사람에게는 새로운 거예요. 당신한테만 아닐 뿐이죠.