Programming Language/Python

Python ORM : SQLAlchemy

devsean 2025. 5. 3. 21:35

ORM(Object-Relational Mapping)

ORM은 객체와 RDB 테이블을 매핑해주는 기술을 의미한다. 어플리케이션에서 DB I/O를 수행할 때, 추상화 계층을 한 번 더 두어서 SQL 쿼리가 아닌 프로그래밍 언어로 수행할 수 있게끔 한다. 이를 통해 개발자는 비즈니스 로직을 작성하는 데에 집중하게 되어 개발 생산성과 프로젝트의 유지/보수성이 높아진다. 관련 기술로는, 대표적으로 Java 진영의 JPA/Hibernate과 이를 보완하는 QueryDSL이 있다. Python 진영에서는 SQLAlchemy가 동일한 역할을 한다.

 

SQLAlchemy

SQLAlchemy는 DB 연결, 자원 관리, SQL Expression Language, ORM 까지 DB I/O 기능을 제공하는 Python 패키지이다. SQLAlchemy 하위에는 SQLAlchemy ORM, SQLAlchemy Core 2개의 프로젝트가 존재한다. 전자가 ORM 관련 기능을, 후자가 DB 접근과 관련한 핵심 기능들을 포함한다.

SQLAlchemy Core

다음과 같이 DB 연결을 생성하고, Python 문법을 활용해 쿼리를 수행할 수 있다.

import sqlalchemy as sa
from sqlalchemy import select

# 1. DB 엔진 생성 : 내장 DB인 sqlite와, postgreSQL, mariaDB등 다양한 RDB 엔진을 제공
engine = sa.create_engine("sqlite://")

# 2. 테이블 정보 생성
meta = sa.MetaData()
zoo = sa.Table('zoo', meta,
               sa.Column('critter', sa.String, primary_key=True),
               sa.Column('count', sa.Integer),
               sa.Column('damages', sa.Float))
meta.create_all(engine)

# 3. 커넥션 생성 및 Python으로 쿼리 수행
with engine.connect() as connection:
    stmt = zoo.insert().values(critter='bear', count=2, damages=1000.0)
    connection.execute(stmt)
    connection.commit() 

with engine.connect() as connection:
    result = connection.execute(select(zoo)).fetchall()
    print(result)

 

SQLAlchemy ORM

Python 객체를 활용하여 테이블을 생성하고 쿼리를 수행할 수 있다. 위에서는 커넥션을 생성해서 직접 요청을 보낸 것과 달리, 세션을 생성하고 변경 내용을 추가해서 한 번에 커밋하는 방식을 수행한다.

import sqlalchemy as sa
engine = sa.create_engine("sqlite://")

# 1. 필요한 모듈 import
from sqlalchemy.orm import declarative_base, sessionmaker

# 2. ORM 기반 클래스 선언
Base = declarative_base()

# 3. 모델 클래스 정의
class Zoo(Base):
    __tablename__ = 'zoo'
    critter = sa.Column('critter', sa.String, primary_key=True)
    count = sa.Column('count', sa.Integer)
    damages = sa.Column('damages', sa.Float)
    def __init__(self, critter, count, damages):
        self.critter = critter
        self.count = count
        self.damages = damages
    
    def __repr__(self):
        return f"<Zoo(critter={self.critter}, count={self.count}, damages={self.damages})>"

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

# 5. 세션 생성
Session = sessionmaker(bind=engine)
session = Session()

# 6. 데이터 추가 (INSERT)
z1 = Zoo(critter='bear', count=2, damages=1000.0)
z2 = Zoo(critter='weasel', count=1, damages=2000.0)

session.add(z1)
session.add(z2)
session.commit()

# 7. 데이터 조회 (SELECT)
animals = session.query(Zoo).all()
for animal in animals:
    print(animal)

# 8. 세션 종료
session.close()

 

 

그 밖에 다른 ORM들

일반적으로 ORM은 API를 만들 때 함께 사용된다. Django는 Django ORM을, FastAPI는 SQLModel을 제공한다. Django ORM은 SQLAlchemy와는 독자적이며, SQLModel은 SQLAlchemy를 확장하였다. 참고로 Flask는 특정 ORM을 제공하고 있지 않으며, SQLAlchemy를 사용할 수 있다.

 

참고 자료

처음 시작하는 파이썬 2판 16장 파일과 데이터베이스 (빌 루바노빅, 2020)

 

Overview — SQLAlchemy 2.0 Documentation

Overview The SQLAlchemy SQL Toolkit and Object Relational Mapper is a comprehensive set of tools for working with databases and Python. It has several distinct areas of functionality which can be used individually or combined together. Its major components

docs.sqlalchemy.org

 

SQL (관계형) 데이터베이스 - FastAPI

FastAPI framework, high performance, easy to learn, fast to code, ready for production

fastapi.tiangolo.com

 

[Django] Django ORM이란 무엇일까?

Django ORM이란? Django ORM이란 Object Relational Mapping의 줄임말이며 객체(Object)와 관계형 데이터베이스(Relational)을 연결(Mapping) 해준다는 뜻이다. 위의 말만 들어서는 Django ORM이라는 것이 잘 와닿지 않는

choirim.tistory.com