DB

[SQLAlchemy] FastAPI에서는 어떻게 DB와 연결할까?

선호하는 2024. 8. 6. 09:00

SQLAlchemy를 지원하는 FastAPI

FastAPI는 SQLAlchemy를 권장 ORM으로 설정하고 있다.

나는 FastAPI로 서버 개발을 시작하고, 더 많은 데이터를 안전하고 쉽게 관리하기 위해, DB와 연결을 시도했다. 이 글에서는, 그 일련의 과정을 정리해 보려고 한다.

lib 설치

사용하는 라이브러리는, 당연하게도 fastapi와 sqlalchemy이다. 그 외에, 각 DB마다 비동기 연결을 위한 aio 라이브러리를 추가로 설치해 주어야 한다.

DB 연결 설정하기

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "사용할 DB 위치 경로"

engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
  1. DB 경로 선언하기
    기본 구조는 다음과 같다.

    {사용할 DB 엔진명}+{비동기 연결시 사용할 라이브러리 명}://{root_id}:{root_password}@{DB 경로}/{Database 이름}
  2. create_engine으로 DB 엔진 인스턴스 생성하기.
    sqlalchemy의 create_engine 함수를 사용하여 엔진을 생성해 준다.
    비동기 연결을 위해서는 create_engine이 아닌 sqlalchemy.ext.asyncio의 create_async_engine 함수를 사용해야 하고, DB 경로를 선언할 때, aio 라이브러리 이름을 추가해 줘야 한다.

  3. sessionmaker를 사용해 세션 인스턴스 생성

    SessionLocal = sessionmaker(bind=engine)

    bind에 아까 생성한 DB 엔진 인스턴스를 sessionmaker에 등록해 주면 된다.
    sessionmaker는 추가 설정이 가능한데, 종류는 다음과 같다.

    • autocommit=T/F: 트랜잭션 자동 커밋 승인/제한
    • autoflush=T/F: 변경 내용 자동 갱신 승인/제한
    • expire_on_commit=T/F: 커밋 후 객체 속성 만료 활성/비활성
    • class_={세션}: 세션 클래스 설정. 동기 세션은 선언하지 않아도 되는데, 비동기 세션 설정을 위해서는 sqlalchemy.ext.asyncio의 AsyncSession과 같은 비동기 세션 클래스를 가져와야 한다.
  4. declarative_base를 사용해 베이스 생성
    각 테이블의 기본이 되는 베이스를 선언해 주는 부분이다.

    Base = declarative_base()

    이제 베이스를 사용해 테이블 모델을 선언하고, 실제 DB와 동기화하거나 테이블을 추가/삭제를 할 수 있다.

마치며

DB 연결을 위해서, 자바에서는 JDBC 같은 걸 사용하듯, python에서는 SQLAlchemy를 사용한다. 사람마다 사용하는 ORM이 다르긴 하겠지만, FastAPI를 사용해 개발하는 경우, 권장사항인 SQLAlchemy를 사용하는 것이 맞지 않을까 싶다.