DB/Sqlalchemy

[SQLAlchemy] (2) Core 방식 vs ORM 방식

yubi5050 2024. 8. 25. 23:30

개요

SQLAlchemy를 통해 DB와 상호 작용하는 코드를 작성할 때 작성 방법에는 크게 2가지 방향이 있다.

 

Core 방식과 ORM 방식. Core 방식은 SQL 문을 보다 직접적인 컨셉으로 활용하여, 성능에 이점이 있는 방법이며, ORM 방식은 Python 클래스를 데이터 베이스의 테이블에 매핑한 추상화된 방식을 제공하여 더 사용하기 쉽게 만드는 방법이다.

 

1. SQLAlchemy Core 방식

SQL 추상화 계층을 제공하고, 데이터베이스와 직접 작업할 수 있는 저수준 SQL 툴킷

보다 직접적인 SQL 쿼리 작성을 통해 표현 하는 방법

Session 객체 보다는 직접적인 커넥터를 통한 연결 방법과 비슷

트랜잭션 및 연결 풀링에 대해 수동으로 처리

 

문법적인 차이

- SQL 추상화 계층 함수(SQL 친화적인)들도 제공함 ex) select, insert, update, delete, from, where 등

- 모델 선언시 from sqlalchemy의 Table, MetaData 등 직접적인 객체 사용

 

예시 코드

from sqlalchemy import create_engine, MetaData, Table, select

# engine 생성
engine = create_engine('sqlite:///example.db')
metadata = MetaData()

# ==== 방법 1 ====
# Table 객체, metadata 객체, engine 객체 활용
user = Table('User', metadata, autoload_with=engine)
stmt = select(user)

# conn.execute(쿼리)를 통한 실행
with engine.connect() as conn:
    result = conn.execute(stmt)
    for row in result:
        print(row)

 

 

2. SQLAlchemy ORM 방식

SQLAlchemy ORM에서 제공하는 문법을 통해 쿼리를 작성하고 실행

트랜잭션 및 연결 풀링에 대한 기본적인 지원

문법적인 차이

- declarative_base를 통한 모델 선언, sessionmaker 객체를 활용한 session 객체 생성

- 모델 선언시 from sqlalchemy.orm의 sessionmaker, declarative_base 등 사용

- session 객체 하위의 add, commit(), scalars(), all() 등 사용

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


# 1. engine 생성
engine = create_engine('sqlite:///example.db')

# 2. Base 객체 생성
Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

# 3. (Optional) 해당 Engine의 DB에 Metadata를 바탕으로 테이블 생성
Base.metadata.create_all(engine)

# 4. 세션 팩토리 및 세션 객체 생성
Session = sessionmaker(bind=engine)
session = Session()

# 데이터 추가
new_user = User(name='Alice', age=30)
session.add(new_user)
session.commit()

# orm 문법이 제공하는 query, all() 등 사용
for user in session.scalars(select(User)).all()	:
    # user는 그냥 user 객체임.
    print(user.name, user.age)