Connecting Database in FastAPI using SQLAlchemy

Posted by


FastAPI는 Python의 고성능 웹 프레임워크로서, 데이터베이스와의 연결을 쉽게 구현할 수 있습니다. SQLAlchemy는 Python의 ORM(Object Relational Mapping) 라이브러리로, 데이터베이스와의 상호작용을 추상화하여 개발자가 더 쉽게 데이터베이스를 다룰 수 있도록 도와줍니다. 이 튜토리얼에서는 FastAPI에서 SQLAlchemy를 사용하여 데이터베이스와의 연결을 설정하는 방법에 대해 알아보겠습니다.

먼저, FastAPI 및 SQLAlchemy를 설치해야 합니다. 다음과 같이 pip를 사용하여 필요한 패키지를 설치할 수 있습니다.

pip install fastapi
pip install uvicorn
pip install sqlalchemy
pip install databases

이제 FastAPI 애플리케이션을 생성하고 데이터베이스 연결을 설정할 차례입니다. 다음과 같이 main.py 파일을 생성하고 코드를 작성합니다.

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

# FastAPI 애플리케이션 생성
app = FastAPI()

# SQLAlchemy 설정
SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

위 코드에서는 FastAPI 애플리케이션을 생성하고, SQLAlchemy를 사용하여 데이터베이스와의 연결을 설정했습니다. sqlite:///./test.db은 SQLite 데이터베이스 파일의 경로를 나타내며, 실제 프로젝트에서는 원하는 데이터베이스를 사용할 수 있습니다.

다음으로, SQLAlchemy 모델을 정의합니다. 이 모델은 데이터베이스의 테이블을 나타내며, ORM을 통해 해당 테이블과 상호작용할 수 있습니다.

from sqlalchemy import Column, Integer, String

class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String)
    email = Column(String, unique=True)

이제 FastAPI의 각 엔드포인트에서 데이터베이스를 사용할 수 있도록 응용프로그램과 모델을 연결해야 합니다. 이를 위해 각 요청에서 데이터베이스 세션을 만들고, 요청 처리 후에 세션을 종료해야 합니다. 아래와 같이 SQLAlchemy 세션을 FastAPI 디펜던시로 만들어 이를 해결할 수 있습니다.

from fastapi import Depends
from sqlalchemy.orm import Session

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

사용자를 생성하거나 조회하는 엔드포인트를 작성할 때는 get_db 함수를 FastAPI 디펜던시로 사용하여 데이터베이스 세션을 가져오고, 해당 세션을 닫습니다.

이제 FastAPI와 SQLAlchemy를 사용하여 데이터베이스와의 연결을 설정하는 방법을 알아보았습니다. 이를 바탕으로 본격적인 데이터베이스와의 상호작용을 구현할 수 있으며, 프로젝트의 요구에 맞게 데이터베이스 스키마 및 모델을 확장할 수 있습니다. 데이터베이스와의 연결 설정은 FastAPI 및 SQLAlchemy의 강력한 기능을 활용하여 프로젝트의 확장성을 향상시킬 수 있습니다.

0 0 votes
Article Rating
13 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
@위해-i7o
1 month ago

감사히 잘 보고 있습니다. 화질을 조그만 올려주시면 더 감사히 열심히 보겠습니다. 코드 보기가 조금 어려워서요..한번 업로드 된 영상을 수정하기 어렵다고 알고 있는데. 다음에 업로드 해주실때는 참고해 주시면 감사하겠습니다.

@72indosaram13
1 month ago

링크 주소가 없네요. 다른 곳에 있나요? 부탁드리겠습니다.

@추송현-c3h
1 month ago

안녕하십니까 FastAPI강의 잘 듣고 있습니다
강의 듣던도중에 DB관련해서 쿼리문을 보고 싶은데 잘 보이지가 않아서 또한 사이트에 있는 것도 페이지가 없어서
혹시나 쿼리문을 따로 받을수 있는지 늦게나마 질문을 드립니다 ㅜㅜ

@ptw880
1 month ago

FastAPI 강의 감사합니다!
다만 저도 DB 관련 생성해서 질문이 있는데요, Base = declarative_base()를 상속해 DB 생성을 orm으로 만들 수 있다고 공식문서에는 나와 있는데, 따로 SQL문으로 DB 생성을 하지 않고 ORM으로 만들 수 있는 방법이 있을까요?

@파쟁고
1 month ago

엇? 패스트캠퍼스에서 강의 하셨던 분 맞으시죠????

@DiversOcean
1 month ago

딩그르르 사이트가 안들어가져요 ㅠㅠ

@bigcco
1 month ago

라이언님 강의 너무 너무 고맙습니다. 근데 화면 글씨가 너무 작게 보입니다. 차후 강의시 화면을 확대해서 강의해 주시면 너무 고맙겠습니다. 수고하세요.

@yyyy-ff4kf
1 month ago

좋은 강의 감사합니다. 화질이 아쉽네요 ㅠㅠㅠ

@김대경-j9x
1 month ago

안녕하세요! 튜토리얼 보면서 많이 배우고있습니다!
덕분에 코드 구성이나 폴더관리부분에서 많이 얻어가는게 있는거같아요 감사합니다😊
혹시 문제가되지않는다면 따라 한 코드를 개인 블로그에 포스팅 하면서 공부해도 될까요?

@이현준-v6u
1 month ago

fastapi에서 모든 api @router.get이 붙어있는 함수는 async를 다 붙여줘야되나요?
붙여주지 않게되면 성능에 큰 이슈가 있는건지 궁금합니다.

@김건호-w8k
1 month ago

어제 시작해서 오늘 3화까지 따라왔네요. 양질의 강의 감사드립니다.

@김누누
1 month ago

안녕하세요, 강의를 따라서 보고있는데 질문? 의견?이 있어서 댓글 달게되었습니다, fastapi로 python framework를 처음 접하다보니 생기는 문제일수도있는데,
강의만 보면서 따라가면서코드를 실행해보니 처음엔 유저가없고 유저를생성하니 db가 없고 db를 생성하니 table이 없다고 하네요
제가 강의를 잘 못따라가서 table도 생성이 되어야하는데 안된건지.. insert쿼리 날라가는 log만 볼수있네요 .ㅠㅠ
mysql 유저 생성, db생성, table생성 에대한 내용이 있으면 좋지 않을까 싶었어요, (다루고자 하는 주제와 너무 멀어지는 내용일까요?)

@corear
1 month ago

The baseline in the intro music sounded like a cover of Los ninos del parque!