FastAPI와 SQLAlchemy를 사용하여 ORM 기능 구현하기

FastAPI는 빠르고 간단한 웹 애플리케이션 프레임워크로서, 데이터베이스와의 상호작용을 위해 ORM(Object Relational Mapping) 라이브러리인 SQLAlchemy와 함께 사용할 수 있습니다. 이번 포스트에서는 FastAPI와 SQLAlchemy를 사용하여 ORM 기능을 구현하는 방법에 대해 알아보겠습니다.

SQLAlchemy 설정하기

먼저, FastAPI에서 SQLAlchemy를 사용하기 위해서는 SQLAlchemy를 설치해야 합니다. 다음 명령어를 사용하여 SQLAlchemy를 설치할 수 있습니다.

pip install sqlalchemy

설치 후, FastAPI 애플리케이션에서 SQLAlchemy를 설정해야 합니다. 예를 들어, main.py 파일에 다음과 같이 설정할 수 있습니다.

from fastapi import FastAPI
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

app = FastAPI()

# 데이터베이스 연결
SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# 의존성 주입
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

위 코드에서는 SQLALCHEMY_DATABASE_URL을 통해 SQLite 데이터베이스에 연결하는 SQLAlchemy engine을 생성하고, SessionLocal을 통해 세션을 관리합니다. get_db 함수로 의존성을 주입하여 각 엔드포인트에서 데이터베이스 세션을 사용할 수 있도록 합니다.

ORM 모델 정의하기

다음으로, ORM을 사용하여 데이터베이스를 다루기 위해 모델을 정의해야 합니다. 예를 들어, models.py 파일에 다음과 같이 모델을 정의할 수 있습니다.

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = "users"
    
    id = Column(Integer, primary_key=True, index=True)
    username = Column(String, unique=True, index=True)
    email = Column(String, unique=True, index=True)
    password = Column(String)

위 코드에서는 SQLAlchemy의 Column 클래스를 사용하여 각 필드를 정의하고, Base 클래스를 상속받아 모델을 선언합니다.

CRUD 연산 구현하기

마지막으로, FastAPI에서 데이터베이스의 CRUD(Create, Read, Update, Delete) 연산을 구현할 수 있습니다. 예를 들어, main.py 파일에 다음과 같이 연산을 구현할 수 있습니다.

from fastapi import FastAPI, HTTPException
from sqlalchemy.orm import Session

from . import models, schemas

...

@app.post("/users/", response_model=schemas.User)
def create_user(user: schemas.UserCreate, db: Session = Depends(get_db)):
    db_user = models.User(username=user.username, email=user.email, password=user.password)
    db.add(db_user)
    db.commit()
    db.refresh(db_user)
    return db_user

@app.get("/users/{user_id}", response_model=schemas.User)
def read_user(user_id: int, db: Session = Depends(get_db)):
    db_user = db.query(models.User).filter(models.User.id == user_id).first()
    if db_user:
        return db_user
    else:
        raise HTTPException(status_code=404, detail="User not found")

...

위 코드에서는 User 모델에 대한 생성과 조회 연산을 구현하였습니다. create_user 함수에서는 입력받은 데이터를 기반으로 새로운 사용자를 생성하고 데이터베이스에 저장합니다. read_user 함수에서는 사용자의 user_id를 기반으로 해당 사용자를 조회합니다.

이와 같이 FastAPI와 SQLAlchemy를 함께 사용하여 ORM 기능을 구현할 수 있습니다. FastAPI의 빠른 속도와 SQLAlchemy의 강력한 ORM 기능을 통해 간편하게 웹 애플리케이션을 개발할 수 있습니다.

#fastapi #sqlalchemy