데이터베이스 모델 생성
Python-FastAPI

ORM

객체와 RDBMS의 데이터를 자동으로 매핑한다.

데이터베이스에 맞는 SQL을 자동으로 생성하므로 코드 작성이 일관적이고, 재사용과 유지보수가 편리하다.


SQLAlchemy

ORM 라이브러리로는 SQLAlchemy를 사용한다.

1
pip install sqlalchemy

database.py

ORM을 적용하기 위해서는 데이터베이스 설정이 필요하다.

1
2
3
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
  • create_engine

    커넥션 풀Connection Pool을 생성한다.

    커넥션 풀

    일정 개수의 커넥션 객체를 생성해 데이터베이스에 접속하는 세션 수를 제어한다.

    생성한 커넥션 객체는 사용자의 요청이 발생할 때 넘겨주었다가, 사용이 끝나면 풀로 다시 반환된다.

    커넥션 풀을 사용하면 서버의 부하를 줄이고 서버의 한정된 자원을 효율적으로 사용할 수 있다.

    https://programmer93.tistory.com/74

    1
    2
    3
    4
    5
    6
    7
    
    # 데이터베이스 접속 주소: sqlite3 데이터베이스의 파일을 루트 디렉터리에 저장한다.
    SQLALCHEMY_DATABASE_URL = "sqlite:///./myapi.db"
      
    engine = create_engine(
        SQLALCHEMY_DATABASE_URL,
        connect_args={"check_same_thread": False}
    )
    
  • sessionmaker

    데이터베이스에 접속하기 위해 필요한 세션 클래스를 생성한다.

    1
    2
    3
    4
    5
    
    SessionLocal = sessionmaker(
        autocommit=False,
        autoflush=False,
        bind=engine
    )
    

    autocommit=False로 설정하면 db Session의 commit() 메서드를 호출해야만 변경사항이 데이터베이스에 적용된다. 만약 데이터를 잘못 저장했어도 rollback() 메서드를 호출해 되돌릴 수 있다.

  • declarative_base

    데이터베이스 모델을 생성한다.

    1
    
    Base = declarative_base()
    

models.py

database.py에서 정의한 Base 클래스를 상속하는 방식으로 모델 클래스를 생성한다.

1
from database import Base

테이블을 CREATE에 사용되는 명령어를 import한다.

1
from sqlalchemy import Column, Integer, String, Text, DateTime

(예시)

1
2
3
4
5
6
7
class Question(Base):
    __tablename__ = "question"

    id = Column(Integer, primary_key=True)
    subject = Column(String, nullable=False)
    content = Column(Text, nullable=False)
    create_date = Column(DateTime, nullable=False)