SQLite 데이터베이스는 그냥 파일 하나입니다
MySQL이나 Postgres를 써봤다면 CREATE DATABASE myapp; 같은 명령으로 서버가 알아서 어딘가에 새 데이터베이스를 등록해 주는 흐름에 익숙할 겁니다. 그런데 SQLite는 방식이 완전히 다릅니다. 서버도 없고, CREATE DATABASE 같은 구문도 없습니다. SQLite에서 데이터베이스란 그냥 디스크에 있는 파일 하나일 뿐이에요. 보통 .db, .sqlite, .sqlite3 확장자를 쓰긴 하지만, 이건 어디까지나 관례일 뿐 정해진 규칙은 아닙니다.
새 데이터베이스를 만들고 싶다면, 아직 존재하지 않는 파일 이름을 sqlite3 도구에 넘겨주면 됩니다:
sqlite3 mydata.db
끝입니다. mydata.db 파일이 없으면 SQLite가 새로 만들 준비를 하고, 이미 있으면 그 파일을 엽니다. 명령어는 동일한데 두 경우 모두 처리해 주는 거죠. "데이터베이스 서버를 띄운다"기보다는 "문서를 연다"는 느낌에 더 가깝습니다.
뭔가 써야 .db 파일이 실제로 생긴다
여기서 많은 분들이 헷갈리는 부분이 있습니다. 위 명령을 실행하고 .quit로 빠져나온 뒤 디렉터리를 확인해 보세요. 파일이 없습니다.
SQLite는 게으릅니다. 디스크에 저장할 내용이 생기기 전까지는 굳이 파일을 만들지 않아요. 테이블을 만들거나 데이터를 커밋하는 순간, 비로소 파일이 모습을 드러냅니다:
이제 디스크에 mydata.db 파일이 생성됐습니다. 첫 쓰기 작업이 일어나기 전까지 "데이터베이스"는 사실 커넥션 메모리 안에만 존재합니다. 이 동작은 가끔 헷갈리기도 하지만, 반대로 유용한 면도 있습니다. 작업 도중에 중단하면 디스크에 아무 흔적도 남지 않으니까요.
CLI로 SQLite 데이터베이스 만들기
새 셸에서 시작하는 전체 흐름은 다음과 같습니다.
$ sqlite3 mydata.db
SQLite version 3.45.0
Enter ".help" for usage hints.
sqlite> CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT);
sqlite> .databases
main: /home/you/mydata.db r/w
sqlite> .quit
셸에 들어간 김에 알아두면 편한 CLI 명령어 몇 가지를 소개할게요:
.databases— 현재 연결된 데이터베이스와 파일 경로를 확인합니다..tables— 현재 데이터베이스의 테이블 목록을 보여줍니다..schema— 모든 객체의CREATE TABLE문을 출력합니다..quit— 셸을 종료합니다.
인자 없이 sqlite3를 실행해서 아직 열린 파일이 없는 상태라면, .open 명령으로 파일을 연결할 수 있습니다:
sqlite> .open mydata.db
규칙은 같습니다. 파일이 없으면 새로 만들고, 있으면 그냥 엽니다.
"IF NOT EXISTS"는 기본 동작
다른 DB를 쓰던 분들이 자주 걱정하는 부분이 있죠. "이미 파일이 있으면 어떡하지? 덮어써 버리나?" 결론부터 말하면 그럴 일 없습니다. 기존 파일을 열면 그냥 열릴 뿐, 덮어쓰기는 일어나지 않습니다. 다른 DB의 CREATE DATABASE IF NOT EXISTS에 가장 가까운 동작이 바로 SQLite에서 파일을 여는 그 자체예요. 두 경우 모두 똑같은 명령으로 처리됩니다.
처음부터 깨끗하게 시작하고 싶다면, 먼저 파일을 삭제하면 됩니다.
rm mydata.db
sqlite3 mydata.db
정말 그럴 의도인지 한 번 더 확인하세요. 되돌리기(undo) 기능도 없고, 복구해 줄 관리자 도구도 따로 없습니다.
파이썬에서 SQLite 데이터베이스 만들기
실무에서는 CLI를 직접 두드릴 일보다, 애플리케이션 코드에서 데이터베이스를 생성할 일이 훨씬 많습니다. 다행히 파이썬에는 표준 라이브러리에 sqlite3 모듈이 기본으로 들어 있어서 따로 설치할 필요가 없습니다:
sqlite3.connect("mydata.db")도 CLI와 똑같은 규칙을 따릅니다. 파일이 없으면 만들고, 있으면 그냥 엽니다. 다른 언어 바인딩들도 마찬가지인데, Node의 better-sqlite3, Go의 database/sql 드라이버, Rust의 rusqlite 같은 것들 전부 내부적으로 동일한 C 라이브러리를 감싸고 있기 때문입니다.
파이썬에만 있는 편리한 기능 하나: 경로 자리에 ":memory:"를 넘기면 RAM에서만 살아 있는 데이터베이스가 만들어지고, 연결을 닫는 순간 사라집니다. 이건 다음 페이지에서 다룹니다.
.db 파일은 어디에 둬야 할까?
데이터베이스가 곧 파일이다 보니 "어디에 저장하지?"가 꽤 중요한 문제가 됩니다. 몇 가지 기준을 잡아두면 좋습니다:
- 앱이라면: 사용자 데이터 디렉터리나 앱 작업 디렉터리 아래에 두세요. 실행 파일 옆에 두는 건 권장하지 않습니다 — 그 경로에 쓰기 권한이 없는 OS도 있습니다.
- 프로젝트라면: 저장소 루트나
data/폴더에 두세요. 로컬 상태를 담는 용도라면.gitignore에 추가하는 게 좋습니다. 바이너리 DB 파일을 Git에 커밋하면 보통 좋게 끝나지 않습니다. - 테스트라면:
:memory:또는 임시 파일을 쓰세요. 빠르고 뒷정리도 알아서 됩니다.
권한도 신경 써야 합니다. 프로세스를 실행하는 사용자에게 파일은 물론 그 상위 디렉터리 에도 읽기/쓰기 권한이 있어야 합니다. SQLite는 쓰기 작업 중에 데이터베이스 파일 옆에 락 파일을 함께 만들기 때문입니다.
동작 확인 한 번 해보기
전체 흐름이 제대로 돌아가는지 끝에서 끝까지 확인해 봅시다:
두 개의 행이 출력되어야 합니다. 여기까지 잘 나왔다면, 데이터베이스 파일이 만들어졌고, 그 안에 스키마가 들어 있으며, 데이터를 쿼리할 수 있다는 뜻입니다. SQLite에서 "데이터베이스 생성"이라는 이야기는 이게 전부입니다 — 서버도 없고, 사용자도 없고, 권한 테이블 같은 것도 없습니다. 그냥 파일 하나면 끝이죠.
다음 주제: SQLite 인메모리 DB
방금 파일을 만들 때 사용한 sqlite3.connect(...)에 인자만 살짝 바꿔주면, 디스크에 전혀 닿지 않는 데이터베이스도 만들 수 있습니다. 인메모리 DB는 테스트를 돌리거나, 스키마를 빠르게 프로토타이핑하거나, 잠깐 쓰고 버릴 데이터를 다룰 때 가장 빠른 방법이죠. 이어서 바로 살펴보겠습니다.
자주 묻는 질문
SQLite에서 데이터베이스는 어떻게 만드나요?
터미널에서 sqlite3 mydata.db를 실행하면 됩니다. 해당 파일이 없으면 새로 만들고, 이미 있으면 그 파일을 열어줍니다. 별도의 CREATE DATABASE 문 같은 건 필요 없어요 — SQLite에서는 파일 자체가 곧 데이터베이스니까요.
SQLite에도 CREATE DATABASE 명령이 있나요?
없습니다. MySQL이나 PostgreSQL과 달리 SQLite에는 CREATE DATABASE SQL 문이 존재하지 않습니다. sqlite3 CLI나 Python의 sqlite3 모듈 같은 클라이언트가 존재하지 않는 파일명을 가리키는 순간, 그 시점에 데이터베이스가 만들어집니다.
새로 만든 SQLite 파일이 비어 있거나 아예 안 보이는데요?
SQLite는 게으릅니다(lazy). 첫 테이블을 만들거나 트랜잭션을 커밋하기 전까지는 디스크에 파일을 실제로 쓰지 않아요. 그래서 sqlite3 mydata.db만 입력하고 그냥 종료하면 파일이 생기지 않습니다. 테이블을 하나 만들거나 .databases 명령을 실행하면 그제서야 파일이 나타납니다.
Python에서 SQLite 데이터베이스를 어떻게 만드나요?
내장 모듈인 sqlite3를 임포트하고 sqlite3.connect('mydata.db')를 호출하면 끝입니다. 파일이 없으면 자동으로 만들어줍니다. 파일 대신 ':memory:'를 경로로 넘기면 디스크에 저장하지 않는 인메모리 DB로 동작합니다.