[SQLAlchemy] FastAPI에서는 어떻게 DB와 연결할까?
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()
DB 경로 선언하기
기본 구조는 다음과 같다.{사용할 DB 엔진명}+{비동기 연결시 사용할 라이브러리 명}://{root_id}:{root_password}@{DB 경로}/{Database 이름}
create_engine으로 DB 엔진 인스턴스 생성하기.
sqlalchemy의 create_engine 함수를 사용하여 엔진을 생성해 준다.
비동기 연결을 위해서는 create_engine이 아닌 sqlalchemy.ext.asyncio의 create_async_engine 함수를 사용해야 하고, DB 경로를 선언할 때, aio 라이브러리 이름을 추가해 줘야 한다.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과 같은 비동기 세션 클래스를 가져와야 한다.
declarative_base를 사용해 베이스 생성
각 테이블의 기본이 되는 베이스를 선언해 주는 부분이다.Base = declarative_base()
이제 베이스를 사용해 테이블 모델을 선언하고, 실제 DB와 동기화하거나 테이블을 추가/삭제를 할 수 있다.
마치며
DB 연결을 위해서, 자바에서는 JDBC 같은 걸 사용하듯, python에서는 SQLAlchemy를 사용한다. 사람마다 사용하는 ORM이 다르긴 하겠지만, FastAPI를 사용해 개발하는 경우, 권장사항인 SQLAlchemy를 사용하는 것이 맞지 않을까 싶다.