FastAPI는 관계형 데이터베이스를 사용할 필요가 없지만 원하는 모든 관계형 데이터베이스를 사용할 수 있다.
SQLAlchemy에서 지원하는 모든 데이터베이스를 적용할 수 있다.
ORM
https://gmlwjd9405.github.io/2019/02/01/orm.html
파일구조
.
└── sql_app
├── __init__.py
├── crud.py
├── database.py
├── main.py
├── models.py
└── schemas.py
파일 __init__.py
은 빈 파일일 뿐이지만 sql_app
모든 모듈(Python 파일)과 함께 패키지라는 것을 Python에 알려줍니다.
SQLAlchemy
pip install sqlalchemy
파일 생성
>>> sql_app/database.py
sqlalchemy import
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
SQLALCHEMY_DATABASE_URL = "sqlite:///./sql_app.db"
# SQLALCHEMY_DATABASE_URL = "postgresql://user:password@postgresserver/db"
engine = create_engine(
SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
SQLAlchemy용 데이터베이스 URL생성
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
SQLALCHEMY_DATABASE_URL = "sqlite:///./sql_app.db"
# SQLALCHEMY_DATABASE_URL = "postgresql://user:password@postgresserver/db"
engine = create_engine(
SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
이 예에서는 SQLite 데이터베이스에 "연결"합니다(SQLite 데이터베이스로 파일 열기).
파일은 파일의 동일한 디렉토리에 있습니다 sql_app.db
.
그렇기 때문에 마지막 부분은 ./sql_app.db
입니다.
대신 PostgreSQL 데이터베이스 를 사용하고 있었다면 다음 행의 주석 처리를 제거하면 됩니다.
SQLALCHEMY_DATABASE_URL = "postgresql://user:password@postgresserver/db"
이것은 다른 데이터베이스를 사용하려는 경우 수정해야 하는 기본 행입니다.
SQLAlchemy engine만들기
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
SQLALCHEMY_DATABASE_URL = "sqlite:///./sql_app.db"
# SQLALCHEMY_DATABASE_URL = "postgresql://user:password@postgresserver/db"
engine = create_engine(
SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
engine 에서
SQLite에서는 특별히 다음 행이 필요하다.connect_args={"check_same_thread": False}
SessinLocal Class 생성
Base Class 생성
declarative_base()가 클래스를 리턴한다.