SQL 플레이스 홀더 + dataclass (260623)

WonTerry·2026년 6월 23일

Python

목록 보기
16/20
# 데이터베이스 ORM 대체 
# ORM (Object-Relational Mapping) : ORM은 객체 지향 프로그래밍 언어와 관계형 데이터베이스 간의 변환을 자동화하는 기술입니다. 
# 쉽게 말해, 데이터베이스 테이블을 Python 객체로 직접 다룰 수 있게 해줍니다.
# ORM 없이 직접 SQL 사용 vs. ORM 사용 하는 경우 비교

# ORM은 데이터베이스 작업을 더 직관적이고 안전하게 만드는 강력한 도구입니다. 특히:

# 개발 생산성 향상
# 코드 유지보수 용이
# 데이터베이스 추상화
# 타입 안전성
# 하지만 성능이 중요한 시스템에서는 직접 SQL 사용과 조합하는 것이 좋습니다.


from dataclasses import dataclass, asdict
import sqlite3

@dataclass
class Product:
    product_id: int
    name: str
    price: float
    stock_quantity: int
    category: str
    created_at: str = None
    
    def to_dict(self):
        return asdict(self)
    
    def save_to_db(self, conn):
        cursor = conn.cursor()
        cursor.execute(
            # "INSERT INTO products VALUES (?, ?, ?, ?, ?)",
            """INSERT INTO products
            (product_id, name, price, stock_quantity, category) 
            VALUES (?, ?, ?, ?, ?)
            """,    # 더 좋은 습관 (260620)

            (self.product_id, self.name, self.price, self.stock_quantity, self.category)
            # sqlite3의 execute()에서는 SQL문의 ? 플레이스홀더와 튜플의 값이 순서대로 1:1 대응된다. (260620)
            # 용어 : 플레이스 홀더 ? (물음표) - 튜플의 순서가 바뀌는 경우, 잘못 저장되거나 타입 오류 발생 가능성 있음
        )
        conn.commit()
# 사용 예시
product = Product(1, "노트북", 1500000.0, 50, "Electronics")
# 1. to_dict() 메서드 사용 예시
print("to_dict() 결과:")
product_dict = product.to_dict()

print(product_dict)
# 2. save_to_db() 메서드 사용 예시
# SQLite 데이터베이스 연결
conn = sqlite3.connect(':memory:')  # 메모리 상에 임시 데이터베이스 생성
cursor = conn.cursor()

# 파일 생성 없음 - 디스크에 파일이 남지 않음
# 즉시 사용 가능 - 테스트나 예제 실행 시 빠름
# 데이터 안전성 - 테스트 종료 후 자동 정리
# 독립 실행 - 다른 프로세스와 데이터 충돌 없음
# 테스트 전용 - 실제 데이터베이스와 분리됨
# 따라서 :memory:는 테스트, 개발, 예제 코드 등을 위한 임시 데이터베이스 생성 방법이다.
# products 테이블 생성
cursor.execute('''
    CREATE TABLE IF NOT EXISTS products (
        product_id INTEGER PRIMARY KEY,
        name TEXT NOT NULL,
        price REAL NOT NULL,
        stock_quantity INTEGER NOT NULL,
        category TEXT NOT NULL
    )
''')
# 데이터 저장
product.save_to_db(conn)
# 저장된 데이터 확인
cursor.execute("SELECT * FROM products")
saved_product = cursor.fetchone()
print("\nsave_to_db() 후 데이터 확인:")
print(saved_product)
# 출력: (1, '노트북', 1500000.0, 50, 'Electronics')
# 연결 종료
conn.close()
profile
Hello, I'm Terry! 👋 Enjoy every moment of your life! 🌱 My current interests are Signal processing, Machine learning, Python, Database, LLM & RAG, MCP & ADK, Multi-Agents, Physical AI, ROS2...

0개의 댓글