Data Engineering/python

EP15 | 고급 Python 활용 #4 | SQL과 데이터베이스 다루기 (sqlite3, SQLAlchemy)

ygtoken 2025. 3. 19. 22:58
728x90

이 글에서 다루는 개념

Python에서는 SQL을 활용하여 데이터베이스를 다룰 수 있으며,
이를 위해 내장 모듈인 sqlite3와 강력한 ORM 라이브러리인 SQLAlchemy를 사용할 수 있습니다.
이번 글에서는 다음 내용을 학습합니다.

  • SQLite 데이터베이스 사용법 (sqlite3 모듈)
  • 기본 SQL 명령어 (SELECT, INSERT, UPDATE, DELETE)
  • SQLAlchemy를 활용한 ORM(Object-Relational Mapping)
  • 데이터베이스 연결과 테이블 생성, CRUD 연산

1️⃣ SQLite 데이터베이스란?

SQLite는 가벼운 파일 기반 데이터베이스로, 별도의 서버 설치 없이 사용 가능합니다.
Python에서는 sqlite3 모듈을 사용하여 SQLite 데이터베이스를 쉽게 다룰 수 있습니다.

📌 SQLite의 특징

  • Python에 기본 포함 (pip install 불필요)
  • 단일 파일(.db)로 저장됨
  • 빠르고 가벼운 관계형 데이터베이스

2️⃣ sqlite3를 사용한 기본 데이터베이스 작업

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

import sqlite3

# 데이터베이스 연결 (없으면 자동 생성)
conn = sqlite3.connect("example.db")
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()   # 연결 종료

 

📌 코드 설명

  • connect("example.db") → 데이터베이스 연결 (파일이 없으면 생성)
  • cursor.execute(SQL문) → SQL 실행
  • commit() → 변경사항 저장
  • close() → 연결 종료

🔹 데이터 삽입 (INSERT)

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

cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Alice", 25))
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Bob", 30))

conn.commit()
conn.close()

 

📌 ?를 사용한 데이터 삽입 (SQL Injection 방지)

  • "INSERT INTO users (name, age) VALUES (?, ?)"
  • ("Alice", 25) 값을 바인딩하여 실행

🔹 데이터 조회 (SELECT)

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', 25)
(2, 'Bob', 30)

🔹 데이터 수정 (UPDATE)

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

cursor.execute("UPDATE users SET age = ? WHERE name = ?", (28, "Alice"))

conn.commit()
conn.close()

🔹 데이터 삭제 (DELETE)

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

cursor.execute("DELETE FROM users WHERE name = ?", ("Bob",))

conn.commit()
conn.close()

📌 데이터 삭제 후 다시 조회하면 "Bob" 데이터가 사라짐


3️⃣ SQLAlchemy를 활용한 ORM (Object-Relational Mapping)

SQLAlchemy는 데이터베이스를 객체처럼 다룰 수 있도록 하는 ORM 라이브러리입니다.
(⚠ sqlite3는 직접 SQL을 사용하지만, SQLAlchemy는 객체 기반으로 조작 가능)

 

📌 설치 방법

pip install sqlalchemy

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

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmaker

# SQLite 데이터베이스 연결
engine = create_engine("sqlite:///example.db", echo=True)
Base = declarative_base()

# 사용자 테이블 정의
class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String, nullable=False)
    age = Column(Integer, nullable=False)

# 테이블 생성
Base.metadata.create_all(engine)

 

📌 코드 설명

  • create_engine("sqlite:///example.db") → SQLite 데이터베이스 연결
  • declarative_base() → ORM 모델의 기반 클래스 생성
  • Column(Integer, primary_key=True) → 기본 키 설정
  • metadata.create_all(engine) → 데이터베이스에 테이블 생성

🔹 SQLAlchemy로 데이터 삽입

Session = sessionmaker(bind=engine)
session = Session()

new_user = User(name="Alice", age=25)
session.add(new_user)  # 데이터 추가
session.commit()  # 변경사항 저장

🔹 SQLAlchemy로 데이터 조회

users = session.query(User).all()

for user in users:
    print(user.id, user.name, user.age)

 

📌 출력 예시

1 Alice 25

🔹 SQLAlchemy로 데이터 수정

user = session.query(User).filter_by(name="Alice").first()
user.age = 28
session.commit()

🔹 SQLAlchemy로 데이터 삭제

user = session.query(User).filter_by(name="Alice").first()
session.delete(user)
session.commit()

📌 데이터 삭제 후 다시 조회하면 "Alice" 데이터가 사라짐


📌 실전 문제: SQL과 데이터베이스 연습하기


문제 1: SQLite를 사용하여 테이블 생성하기

📌 products 테이블을 생성하고, id, name, price 컬럼을 추가하세요.

import sqlite3

# 🔽 여기에 코드 작성
import sqlite3

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

cursor.execute("""
CREATE TABLE IF NOT EXISTS products (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    price REAL NOT NULL
)
""")

conn.commit()
conn.close()

문제 2: SQLite를 사용하여 데이터 삽입 후 조회하기

📌 products 테이블에 데이터("Laptop", 1200.0), ("Phone", 800.0)를 삽입하고 조회하세요.

# 🔽 여기에 코드 작성
conn = sqlite3.connect("example.db")
cursor = conn.cursor()

cursor.execute("INSERT INTO products (name, price) VALUES (?, ?)", ("Laptop", 1200.0))
cursor.execute("INSERT INTO products (name, price) VALUES (?, ?)", ("Phone", 800.0))

conn.commit()

cursor.execute("SELECT * FROM products")
rows = cursor.fetchall()

for row in rows:
    print(row)

conn.close()

문제 3: SQLAlchemy를 사용하여 데이터 삽입 후 조회하기

📌 SQLAlchemy ORM을 사용하여 Product 모델을 만들고, 데이터를 삽입한 후 조회하세요.

# 🔽 여기에 코드 작성
from sqlalchemy import create_engine, Column, Integer, String, Float
from sqlalchemy.orm import declarative_base, sessionmaker

engine = create_engine("sqlite:///example.db")
Base = declarative_base()

class Product(Base):
    __tablename__ = "products"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String, nullable=False)
    price = Column(Float, nullable=False)

Base.metadata.create_all(engine)

Session = sessionmaker(bind=engine)
session = Session()

session.add(Product(name="Laptop", price=1200.0))
session.add(Product(name="Phone", price=800.0))
session.commit()

products = session.query(Product).all()
for product in products:
    print(product.id, product.name, product.price)

 

728x90