프로그래밍/Python

SQLite 완벽 가이드: Python과 함께하는 경량 데이터베이스 활용법

shimdh 2025. 2. 27. 10:14
728x90

현대 애플리케이션 개발에서 데이터베이스(Database)는 필수적인 요소입니다. 하지만 모든 프로젝트에서 거대한 데이터베이스 시스템이 필요한 것은 아닙니다. 특히, 소규모 애플리케이션, 프로토타이핑, 임시 데이터 저장 등의 경우에는 간편하면서도 강력한 SQLite가 매우 유용하게 활용될 수 있습니다.

Python에서는 기본적으로 제공되는 sqlite3 모듈을 활용하여 손쉽게 SQLite 데이터베이스를 다룰 수 있으며, 별도의 서버 설치 없이도 파일 기반의 데이터 관리를 수행할 수 있습니다.

이 글에서는 SQLite의 개념과 특징, Python에서의 사용법, CRUD(생성, 읽기, 수정, 삭제) 연산, 예외 처리 및 최적화 기법까지 심층적으로 다뤄보겠습니다.


1. SQLite란 무엇인가?

🔹 SQLite의 개요

SQLite는 서버 기반의 데이터베이스 시스템과 달리 파일 하나에 모든 데이터를 저장하는 경량 데이터베이스 시스템(RDBMS) 입니다. 이를 통해 설정 없이 즉시 사용 가능하며, 빠른 데이터 관리 및 이동성이 뛰어난 특징을 가집니다.

🔹 SQLite의 주요 특징

  • 파일 기반의 경량 데이터베이스
    • 모든 데이터가 단일 .db 파일에 저장되며, 별도의 데이터베이스 서버가 필요 없음.
  • Python 표준 라이브러리 내장
    • sqlite3 모듈을 통해 Python에서 바로 사용할 수 있음.
  • ACID(원자성, 일관성, 고립성, 지속성) 준수
    • 데이터 무결성을 보장하며 신뢰할 수 있는 트랜잭션 처리 지원.
  • 빠른 읽기 및 쓰기 성능
    • 소규모 애플리케이션에서 우수한 성능을 제공.
  • 멀티플랫폼 지원
    • Windows, Mac, Linux 등 다양한 환경에서 사용 가능.

2. Python에서 SQLite 사용법

SQLite를 사용하기 위해 Python의 sqlite3 모듈을 활용할 수 있습니다. 기본적인 데이터베이스 연결부터 테이블 생성, 데이터 삽입, 조회까지의 과정을 살펴보겠습니다.

🔹 데이터베이스 연결 및 테이블 생성

import sqlite3

# 데이터베이스 연결 (파일이 없으면 새로 생성)
conn = sqlite3.connect('example.db')

# 커서(Cursor) 객체 생성
cursor = conn.cursor()

# 테이블 생성 (없으면 생성)
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    age INTEGER NOT NULL
)
''')

# 변경 사항 저장
conn.commit()

# 연결 종료
conn.close()

✅ 코드 설명:

  1. sqlite3.connect('example.db'): example.db라는 SQLite 데이터베이스 파일에 연결합니다. 파일이 없으면 자동으로 생성됩니다.
  2. cursor.execute(...): users 테이블을 생성하는 SQL 명령어를 실행합니다.
  3. conn.commit(): 변경 사항을 저장합니다.
  4. conn.close(): 데이터베이스 연결을 종료합니다.

3. CRUD 연산: 생성(Create), 조회(Read), 수정(Update), 삭제(Delete)

🔹 데이터 삽입 (Create)

conn = sqlite3.connect('example.db')
cursor = conn.cursor()

# 데이터 삽입
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Alice', 30))
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Bob', 25))

conn.commit()
conn.close()

?를 사용한 바인딩 기법

  • SQL 문에서 직접 값을 삽입하는 것이 아니라 ? 플레이스홀더를 사용하여 값을 전달하면 SQL 인젝션 공격을 방지할 수 있음.

🔹 데이터 조회 (Read)

conn = sqlite3.connect('example.db')
cursor = conn.cursor()

# 전체 데이터 조회
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()

for row in rows:
    print(row)

conn.close()

✅ 실행 결과 예시

(1, 'Alice', 30)
(2, 'Bob', 25)

필터링하여 특정 조건의 데이터만 조회

cursor.execute("SELECT * FROM users WHERE age > ?", (25,))
filtered_rows = cursor.fetchall()

🔹 데이터 수정 (Update)

conn = sqlite3.connect('example.db')
cursor = conn.cursor()

# Alice의 나이를 32로 변경
cursor.execute("UPDATE users SET age = ? WHERE name = ?", (32, 'Alice'))

conn.commit()
conn.close()

🔹 데이터 삭제 (Delete)

conn = sqlite3.connect('example.db')
cursor = conn.cursor()

# 'Bob' 데이터 삭제
cursor.execute("DELETE FROM users WHERE name = ?", ('Bob',))

conn.commit()
conn.close()

DELETE 문을 사용할 때 주의할 점

  • WHERE 절 없이 실행하면 테이블의 모든 데이터가 삭제될 수 있으므로 반드시 필터링 조건을 포함해야 함.

4. 예외 처리와 데이터베이스 안정성

데이터베이스 작업 중 오류가 발생할 수 있으므로, 예외 처리(Exception Handling) 를 통해 프로그램의 안정성을 높이는 것이 중요합니다.

🔹 예외 처리 코드 예제

import sqlite3

try:
    conn = sqlite3.connect('example.db')
    cursor = conn.cursor()

    # 테이블이 존재하는지 확인
    cursor.execute("SELECT * FROM users")

    print("데이터 조회 성공!")

except sqlite3.Error as e:
    print(f"데이터베이스 오류 발생: {e}")

finally:
    if conn:
        conn.close()  # 연결 종료

✅ 예외 처리를 사용하면

  • SQL 문법 오류, 연결 실패, 데이터 무결성 오류 등을 감지하고 적절히 대응 가능.
  • finally 블록에서 데이터베이스 연결을 안전하게 종료할 수 있음.

5. SQLite 성능 최적화 팁

SQLite는 기본적으로 성능이 뛰어나지만, 대량의 데이터를 처리하거나 보다 효율적인 데이터 관리를 위해 최적화할 수 있습니다.

✅ 성능을 높이는 방법

  1. 트랜잭션 사용 (BEGIN TRANSACTION)

    • 여러 개의 INSERT 작업을 하나의 트랜잭션으로 묶어 처리하면 속도가 향상됩니다.
      conn.execute("BEGIN TRANSACTION")
      cursor.execute("INSERT INTO users (name, age) VALUES ('Charlie', 28)")
      cursor.execute("INSERT INTO users (name, age) VALUES ('David', 35)")
      conn.commit()
  2. 인덱스(Index) 추가

    • 검색 속도를 높이기 위해 자주 조회하는 열에 인덱스를 추가할 수 있습니다.
      cursor.execute("CREATE INDEX idx_users_name ON users(name)")
  3. PRAGMA 설정 활용

    • 데이터베이스 성능을 튜닝할 수 있는 SQLite의 고유한 기능.
      cursor.execute("PRAGMA journal_mode=WAL")  # Write-Ahead Logging 모드 사용

🔥 결론: SQLite로 간편하고 강력한 데이터베이스 활용하기

SQLite는 설치 없이 간편하게 사용할 수 있는 강력한 경량 데이터베이스입니다. Python과 함께 사용하면 소규모 애플리케이션, 프로토타이핑, 데이터 저장 및 분석 등의 다양한 작업에서 유용하게 활용할 수 있습니다.

🎯 핵심 정리

  • SQLite는 파일 기반 데이터베이스로 가볍고 이동성이 뛰어남.
  • Python의 sqlite3 모듈을 사용하면 손쉽게 데이터 관리 가능.
  • CRUD 연산을 활용하여 데이터를 생성, 조회, 수정, 삭제 가능.
  • 예외 처리를 추가하여 데이터베이스의 안정성을 높일 수 있음.

SQLite를 적극 활용하여 더욱 효율적이고 안정적인 데이터 관리를 경험해 보세요! 🚀

728x90