반응형

파이썬 데이터베이스 프로그래밍 완전 입문
: SQLite로 배우는 DB 연동 기초

📦 설치도 필요 없는 초간단 DB!
파이썬 초보자도 쉽게 시작할 수 있는
SQLite 데이터베이스 프로그래밍을 지금 배워보세요.

 

 

안녕하세요, 개발자 여러분!

혹시 "파이썬으로 데이터 저장하고 불러오는 거 어렵지 않나요?"라고 고민하셨던 적 있나요?

그런 분들에게 딱 맞는 주제를 준비했어요.

이번 글에서는 SQLite라는 가볍고 강력한 데이터베이스를 파이썬에서 쉽게 다루는 방법을 알려드릴게요.

별도 설치도 필요 없고, 복잡한 설정도 없이 바로 실습이 가능한 SQLite는 초보자에게 정말 딱이에요.

이 글에서는 단순한 문법 나열이 아니라, 실제 예제를 중심으로 데이터를 삽입하고 조회하고 수정하고 삭제하는 CRUD의 전 과정을 SQLite로 따라가면서 익힐 수 있도록 구성했어요.

마지막엔 여러분이 직접 간단한 프로젝트도 구성할 수 있도록 실습 예제까지 제공합니다.

그럼 바로 시작해볼까요? 🚀

 

1. SQLite란 무엇인가요? 특징과 장점

💡 SQLite는 가장 널리 사용되는 내장형 관계형 데이터베이스 시스템(RDBMS) 중 하나예요.

이름에서 알 수 있듯이 ‘가볍고(Small, Lite)’ 빠른 처리 속도와 간편한 사용성을 자랑합니다.

🧠 SQLite의 핵심 개념은?

  • 파일 기반으로 작동하는 DBMS로, 별도의 서버 설치가 필요 없습니다.
  • sqlite3 모듈만으로 파이썬에서 바로 사용 가능합니다.
  • 안드로이드, 크롬 브라우저, iOS 앱 등 다양한 플랫폼에서 널리 사용됩니다.

✨ SQLite의 장점은 무엇일까요?

특징 설명
설치 필요 없음 파이썬 표준 라이브러리에 포함된 sqlite3 모듈로 바로 사용 가능
경량 & 고속 수 MB의 크기만으로도 빠른 성능 제공
파일 기반 저장 하나의 .db 파일만으로 데이터베이스 전체를 구성
트랜잭션 지원 BEGIN, COMMIT, ROLLBACK 등의 SQL 지원
유지보수 용이 파일 하나만 백업해도 모든 데이터 이관 가능

즉, SQLite는 설치 걱정 없이 파일 하나로 모든 기능을 사용할 수 있고, 초보자도 금방 배워서 적용할 수 있는 가장 이상적인 학습용 데이터베이스라고 할 수 있습니다.

 

📌 이런 SQLite의 특성 덕분에, 우리는 서버 설정이나 복잡한 환경 구성 없이 오직 파이썬 코드만으로 데이터베이스 프로그래밍을 시작할 수 있어요.

 

 

2. 파이썬에서 SQLite 사용 준비하기

자, 이제 본격적으로 SQLite를 파이썬에서 사용하는 방법을 알아볼 차례예요.

설치 없이 바로 사용할 수 있는 sqlite3 모듈 덕분에 정말 간단합니다.

우선 우리가 어떤 흐름으로 사용할지부터 짚고 갈게요.

🧭 SQLite 기본 사용 흐름

  1. 1. sqlite3 모듈 임포트
  2. 2. 데이터베이스 연결 (파일 또는 메모리)
  3. 3. 커서(Cursor) 객체 생성
  4. 4. SQL 명령 실행 (테이블 생성, 데이터 삽입 등)
  5. 5. commit() 또는 fetch() 처리
  6. 6. 연결 종료 conn.close()

💻 예제로 보는 SQLite 기본 연결

import sqlite3

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

# 2. 커서 생성
cur = conn.cursor()

# 3. SQL 실행 예시: 테이블 생성
cur.execute("""
CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    age INTEGER
)
""")

# 4. 연결 종료
conn.close()

 

위 코드를 보면 알겠지만, 정말 간단하죠? 😎

특히 테이블 생성 시에는 IF NOT EXISTS 옵션을 주면 이미 존재하는 테이블을 중복 생성하지 않도록 방지할 수 있어요.

💡 메모리 DB도 가능하다?

잠깐 테스트하거나 임시 저장용으로 사용할 때는, 파일이 아닌 메모리 DB를 사용할 수도 있어요. sqlite3.connect(":memory:")처럼 연결하면 디스크에 저장하지 않고 RAM에서만 작동해요.

다만, 프로그램이 종료되면 데이터도 함께 사라지니 주의하세요!

여기까지 오셨다면, SQLite를 사용할 준비는 모두 끝났어요.

 

이제 다음 섹션부터는 본격적으로 데이터를 넣고, 조회하고, 수정하고, 삭제하는 CRUD를 다뤄보겠습니다! 🚀

 

 

3. 테이블 생성과 데이터 삽입 실습

이제 본격적으로 실습을 통해 SQLite의 사용법을 배워볼게요.

먼저, 우리가 사용할 테이블을 만들고 여기에 데이터를 삽입해보겠습니다.

테스트용으로 아주 간단한 회원(users) 테이블을 만들어볼게요.

🛠️ users 테이블 만들기

import sqlite3

# 데이터베이스 연결
conn = sqlite3.connect("example.db")
cur = conn.cursor()

# 테이블 생성
cur.execute("""
CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    email TEXT UNIQUE NOT NULL,
    age INTEGER
)
""")

conn.commit()
conn.close()

이 테이블은 총 4개의 필드를 갖습니다:

  • id: 자동 증가하는 고유 번호 (PRIMARY KEY)
  • name: 사용자 이름 (필수)
  • email: 중복을 허용하지 않는 이메일
  • age: 나이 (정수)

✍️ 데이터 삽입하기

import sqlite3

conn = sqlite3.connect("example.db")
cur = conn.cursor()

# 데이터 삽입
cur.execute("INSERT INTO users (name, email, age) VALUES (?, ?, ?)",
            ("홍길동", "hong@example.com", 30))

# 여러 개 삽입
users = [
    ("김철수", "kim@example.com", 25),
    ("이영희", "lee@example.com", 28)
]
cur.executemany("INSERT INTO users (name, email, age) VALUES (?, ?, ?)", users)

conn.commit()
conn.close()

 

🚨 여기서 중요한 점은 VALUES (?, ?, ?) 부분이에요.

      이 방식은 SQL Injection 같은 보안 문제를 방지할 수 있어요.

     항상 사용자 입력에는 파라미터 바인딩을 사용하는 습관을 들이세요!

 

👀 확인해보기 Tip!

DB 파일이 실제로 생겼는지 확인하고 싶다면, 프로젝트 폴더에 example.db 파일이 생성되어 있는지 살펴보세요.

SQLite를 지원하는 DB 브라우저(DB Browser for SQLite)로 열어보면 테이블과 데이터도 바로 확인할 수 있어요!

 

 

4. 데이터 조회, 수정, 삭제 (CRUD)

테이블에 데이터를 넣었으니, 이제 조회하고 수정하고 삭제하는 과정도 해봐야겠죠?

이걸 통틀어 CRUD (Create, Read, Update, Delete)라고 부릅니다.

실무에서도 가장 자주 쓰이는 데이터 처리 방식이에요.

자, 하나씩 직접 실습해볼게요! 🧪

🔍 1) 데이터 조회 (Read)

import sqlite3

conn = sqlite3.connect("example.db")
cur = conn.cursor()

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

for row in rows:
    print(row)

conn.close()

 

fetchall()을 쓰면 모든 데이터를 한 번에 가져올 수 있어요.

fetchone()은 한 줄만, fetchmany(n)은 n개만 가져올 때 사용해요.

✏️ 2) 데이터 수정 (Update)

conn = sqlite3.connect("example.db")
cur = conn.cursor()

# 특정 사용자 나이 변경
cur.execute("UPDATE users SET age = ? WHERE name = ?", (35, "홍길동"))

conn.commit()
conn.close()

 

업데이트할 땐 조건절(WHERE)을 꼭 넣어주세요!

안 그러면 모든 행이 다 수정될 수도 있어요 😱

🗑️ 3) 데이터 삭제 (Delete)

conn = sqlite3.connect("example.db")
cur = conn.cursor()

# 이메일 기준 삭제
cur.execute("DELETE FROM users WHERE email = ?", ("hong@example.com",))

conn.commit()
conn.close()

 

데이터 삭제도 꼭 조건을 명확히 걸어야 해요.

잘못하면 전체 테이블이 삭제될 수 있으니 항상 WHERE 절은 신중하게!

📌 실습 팁!

  • 실수 방지를 위해 SELECT로 먼저 확인하고, 그다음 UPDATEDELETE를 실행하세요.
  • 삽입, 수정, 삭제 후에는 반드시 conn.commit()을 호출해야 반영됩니다!

이제 여러분은 SQLite로 기본적인 CRUD 작업을 모두 해보셨습니다.

다음은 우리가 배운 내용들을 활용해서 작은 실전 예제를 만들어보는 시간이에요! 💡

 

 

5. SQLite 활용 예제: 간단한 회원 관리 프로그램

이제는 단순히 CRUD만 따로따로 실행하는 게 아니라, 하나의 흐름으로 통합된 프로그램을 만들어볼 시간이에요.

아주 간단하지만 SQLite의 전체 사용 흐름을 한눈에 익힐 수 있는 회원 관리 프로그램 예제를 만들어 보겠습니다.

🧩 프로그램 구성

기능 설명
회원 등록 이름, 이메일, 나이를 입력받아 저장
회원 목록 조회 저장된 전체 회원 정보를 출력
회원 정보 수정 이메일 기준으로 나이 정보 수정
회원 삭제 이메일 기준으로 회원 삭제

💻 전체 코드 예제

import sqlite3

def create_table():
    conn = sqlite3.connect("members.db")
    cur = conn.cursor()
    cur.execute("""
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        email TEXT UNIQUE NOT NULL,
        age INTEGER
    )
    """)
    conn.commit()
    conn.close()

def insert_user(name, email, age):
    conn = sqlite3.connect("members.db")
    cur = conn.cursor()
    cur.execute("INSERT INTO users (name, email, age) VALUES (?, ?, ?)", (name, email, age))
    conn.commit()
    conn.close()

def update_age(email, new_age):
    conn = sqlite3.connect("members.db")
    cur = conn.cursor()
    cur.execute("UPDATE users SET age = ? WHERE email = ?", (new_age, email))
    conn.commit()
    conn.close()

def delete_user(email):
    conn = sqlite3.connect("members.db")
    cur = conn.cursor()
    cur.execute("DELETE FROM users WHERE email = ?", (email,))
    conn.commit()
    conn.close()

def list_users():
    conn = sqlite3.connect("members.db")
    cur = conn.cursor()
    cur.execute("SELECT id, name, email, age FROM users")
    for row in cur.fetchall():
        print(row)
    conn.close()

# 실행 흐름
create_table()
insert_user("홍길동", "hong@example.com", 30)
insert_user("이영희", "lee@example.com", 24)
update_age("hong@example.com", 33)
list_users()
delete_user("lee@example.com")
list_users()

✨ 실습 포인트 정리

  • 코드를 기능별 함수로 나누면 관리가 훨씬 쉬워집니다!
  • conn.commit()을 잊지 않도록 항상 삽입/수정/삭제 후엔 실행하세요.

 

이처럼 여러분이 실제 필요한 기능을 기준으로 코드 구조를 나누면 유지보수도 훨씬 편하고,

나중에 GUI 또는 웹 인터페이스와 연동하기도 쉬워져요!

 

 

6. SQLite를 사용할 때 자주 발생하는 오류와 해결법

SQLite는 사용이 간편한 만큼, 초보자들이 자주 마주치는 실수나 오류들도 있어요.

하지만 대부분은 패턴이 있고, 몇 가지 기본만 잘 기억하면 금방 해결할 수 있답니다.

여기 대표적인 오류 사례와 해결 팁을 정리해드릴게요.

🐛 대표적인 오류와 해결 팁

오류 메시지 원인 해결 방법
sqlite3.OperationalError: no such table 테이블이 생성되지 않았거나 이름이 잘못됨 CREATE TABLE 문 실행 확인, 철자 오타 점검
sqlite3.IntegrityError: UNIQUE constraint failed UNIQUE 제약 조건에 위배되는 중복 데이터 입력 중복 여부 확인 후 입력하거나 try-except로 예외 처리
sqlite3.ProgrammingError: Incorrect number of bindings SQL 문장의 ? 개수와 전달값 수 불일치 바인딩 값 튜플 개수 점검 ((?, ?, ?)에 맞게 전달)
sqlite3.ProgrammingError: Cannot operate on a closed database 닫힌 연결(conn.close 이후)에 작업 시도 conn 객체가 살아 있는지 확인하고 다시 연결

🧯 예외 처리는 필수입니다!

현업에서도 오류는 늘 발생하곤 해요.

그래서 try-except 구문으로 예외를 미리 처리해주는 습관이 정말 중요합니다.

try:
    cur.execute("INSERT INTO users (name, email, age) VALUES (?, ?, ?)",
                ("김민수", "min@example.com", 29))
    conn.commit()
except sqlite3.IntegrityError:
    print("이미 존재하는 이메일입니다.")

 

그니까요, 막연하게 오류 나면 당황하지 말고,

차근차근 메시지를 읽고 해결책을 찾아보는 습관이 필요합니다.

그게 진짜 실력으로 이어지거든요!

 

 

🔚 마무리

이번 글에서는 SQLite의 기초부터 실습 예제까지 아주 친절하고 자세히 살펴봤어요.

설치가 필요 없는 가벼운 DB임에도 불구하고, SQLite는 실제 프로젝트에서도 널리 활용되고 있어요.

파이썬 초보자도 어렵지 않게 다룰 수 있고, 데이터 저장이 필요한 다양한 상황에 바로 적용해볼 수 있다는 게 큰 장점이죠.

 

다음 단계로는 이 데이터베이스를 Flask나 Streamlit 같은 웹 프레임워크와 연결해보는 것도 추천드려요.

그러면 나만의 웹 애플리케이션도 금방 만들 수 있어요! 😉

그럼 다음 시간엔 더 유익한 실습으로 다시 만나요!

반응형

+ Recent posts