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을 생성한다.
커넥션 풀
일정 개수의 커넥션 객체를 생성해 데이터베이스에 접속하는 세션 수를 제어한다.
생성한 커넥션 객체는 사용자의 요청이 발생할 때 넘겨주었다가, 사용이 끝나면 풀로 다시 반환된다.
커넥션 풀을 사용하면 서버의 부하를 줄이고 서버의 한정된 자원을 효율적으로 사용할 수 있다.
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)