/엔지니어/데이터베이스/SQLite 실전 가이드 — CLI · 스키마 ·
데이터베이스초급UbuntuDebianCentOSmacOSsqlitesqlpython

SQLite 실전 가이드 — CLI · 스키마 · 백업 · Python 연동

SQLite CLI 사용법, 테이블 설계, 인덱스·트리거, .dump 백업, Python sqlite3 모듈로 CRUD까지 경량 데이터베이스 활용법을 정리합니다.

설치 및 CLI 시작

Bash
# 설치
sudo apt install -y sqlite3   # Ubuntu
brew install sqlite           # macOS

# 데이터베이스 열기 (없으면 생성)
sqlite3 myapp.db

# 도움말
sqlite> .help

CLI 메타 명령

CODE
.tables              테이블 목록
.schema users        테이블 스키마 확인
.mode column         열 정렬 출력
.headers on          헤더 표시
.width 20 10 30      열 너비 설정
.output result.txt   출력을 파일로
.read script.sql     SQL 파일 실행
.quit                종료

테이블 생성 및 CRUD

SQL
-- 테이블 생성
CREATE TABLE IF NOT EXISTS users (
  id        INTEGER PRIMARY KEY AUTOINCREMENT,
  name      TEXT    NOT NULL,
  email     TEXT    NOT NULL UNIQUE,
  age       INTEGER CHECK(age >= 0),
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE IF NOT EXISTS posts (
  id        INTEGER PRIMARY KEY AUTOINCREMENT,
  user_id   INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
  title     TEXT    NOT NULL,
  body      TEXT,
  published INTEGER DEFAULT 0
);

-- 삽입
INSERT INTO users (name, email, age) VALUES
  ('Alice', '[email protected]', 30),
  ('Bob', '[email protected]', 25);

-- 조회
SELECT * FROM users WHERE age > 20 ORDER BY name;

SELECT u.name, COUNT(p.id) AS post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.id
ORDER BY post_count DESC;

-- 수정
UPDATE users SET age = 31 WHERE email = '[email protected]';

-- 삭제
DELETE FROM users WHERE id = 2;

인덱스 · 트리거

SQL
-- 인덱스 생성
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_posts_user ON posts(user_id, published);

-- 업데이트 시간 자동 갱신 트리거
ALTER TABLE users ADD COLUMN updated_at DATETIME;

CREATE TRIGGER users_updated_at
AFTER UPDATE ON users
FOR EACH ROW
BEGIN
  UPDATE users SET updated_at = CURRENT_TIMESTAMP WHERE id = OLD.id;
END;

-- 인덱스 목록
.indexes users

-- 실행 계획
EXPLAIN QUERY PLAN
SELECT * FROM posts WHERE user_id = 1 AND published = 1;

백업 · 복원

Bash
# 텍스트 덤프 (SQL 형식)
sqlite3 myapp.db .dump > backup_$(date +%Y%m%d).sql

# 복원
sqlite3 restored.db < backup_20250527.sql

# 바이너리 복사 (DB 잠금 상태 확인 후)
sqlite3 myapp.db "VACUUM INTO 'backup.db'"

# WAL 모드에서 안전한 온라인 백업
sqlite3 myapp.db ".backup backup.db"

Python sqlite3 연동

Python
import sqlite3
from contextlib import contextmanager

@contextmanager
def get_db(path="myapp.db"):
    conn = sqlite3.connect(path)
    conn.row_factory = sqlite3.Row  # 딕셔너리처럼 접근
    conn.execute("PRAGMA foreign_keys = ON")
    conn.execute("PRAGMA journal_mode = WAL")
    try:
        yield conn
        conn.commit()
    except Exception:
        conn.rollback()
        raise
    finally:
        conn.close()

# 사용 예시
with get_db() as db:
    # 삽입
    db.execute(
        "INSERT INTO users (name, email, age) VALUES (?, ?, ?)",
        ("Carol", "[email protected]", 35)
    )

    # 조회
    rows = db.execute("SELECT * FROM users WHERE age > ?", (20,)).fetchall()
    for row in rows:
        print(dict(row))

    # executemany (배치 삽입)
    data = [
        ("Dave", "[email protected]", 28),
        ("Eve", "[email protected]", 32),
    ]
    db.executemany(
        "INSERT OR IGNORE INTO users (name, email, age) VALUES (?, ?, ?)",
        data
    )

SQLite 사용 적합한 경우

적합부적합
소규모 앱·프로토타입동시 쓰기 많은 서비스
로컬 캐시·설정 저장수천만 행 이상 대용량
CLI 도구·스크립트분산 클러스터 필요
IoT·엣지 디바이스실시간 복제 필요
#sqlite#sql#python#경량DB#백업#CLI
편집 안내 · Editorial Note

이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.

관련 공식 문서Python 공식 문서

질문 & 답변 (Q&A)

이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.