개인적인 글이라 친절하지 못합니다. 궁금하신점이 있으면 댓글로 부탁드립니다.
아주 매력적인 DB 스키마 마이그레이션 프레임워크이지만 , 이런 저런 사용법이 조금 까다롭기도 하다.
(사전에 sqlalchemy 이 설치 되고 사용법도 어느정도는 알고 있어야 한다.)
pip install sqlalchemy
을 이용하여 우선 sqlalchemy부터 설치한다.
database.py
import os
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
#환경변수에서 가져온 db URL 값이다.
db_url = os.environ.get("db_url")
engine = create_engine(db_url)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
다음으로 모델을 생성해 준다.
products.py
from sqlalchemy import BigInteger, Integer,Column,String,DateTime,Text,UniqueConstraint,func
from sqlalchemy.dialects.mysql import INTEGER
from database import Base
from sqlalchemy.orm import relationship
#부호없는 Integer를 위한 코드
UnsignedInt = Integer()
UnsignedInt = UnsignedInt.with_variant(INTEGER(unsigned=True), 'mysql')
class Items(Base):
__tablename__ = "tblItems"
id = Column(UnsignedInt, primary_key=True, autoincrement=True)
prod_name = Column(String(200), nullable = False)
prod_image = Column(String(300), )
prod_description = Column(Text)
prod_price = Column(Integer, nullable = False, server_default = '1' ) #기본값 지정
create_at = Column(DateTime, server_default=func.now(), nullable = False) #func.now() 현재 날짜 기본값 지정
modified_at = Column(DateTime, server_default=func.now(), nullable = False)
이렇게 모델까지 만들었으면 이제 DB에 그 내용을 옮겨보자
을 이용해 설치해준다.
pip install alembic
명령을 이용해 초기화 해준다.
alembic init migrations
그럼 alembic.ini 파일과 migrations 디렉토리가 생성된다.
수정해 주어야 할 파일들이 있다.
env.py
alembic.ini
먼저 env.py 파일에서
우선 기본적인 설정들을 보면
컬럼이의 데이터 타입이 변경되면 그 변화를 알아차리지 못하고, 기본값을 지정해도 적용이 안된다.
해당위치에
compare_type=True,
compare_server_default=True,
compare_type = True
컬럼이 변경됨을 인지한다.
compare_server_default = True
기본값을 지정해 줄 수 있다.
그리고 metadata을 지정해 줘야 하는데
env.py 파일에서는 다음과 같이 각 모델 파일에서 정의된 Base 클래스를 로드하여 데이터베이스 모델의 메타데이터를 설정할 수 있다.
from database import Base
정확한 이유는 모르겠으나 import 가 되지 않으면 변경사항을 감지 하지 못한다.
때문에 모든 모델들의 import가 이루어 져야 하는데 그 방법은
여러가지가 있겠으나 몇가지 나열하자면
env.py 파일을 수정해 주자.
1. 모든 모델들 import 하기
from models import question, answer
하지만 이 방법은 모델들이 많은 경우 번거롭고 가독성도 좋지 못하다.
2. models 디렉토리에 __init__.py 파일에
다음 내용을 추가해 주는 방법도 있다.
from .question import Question
from .answer import Answer
from .other_model import OtherModel
__all__ = ['Question', 'Answer', 'OtherModel']
from models import *
두 가지 방법 중 어떤 방법을 선택하든
그 다음으로 아래 내용을 변경해 준다
target_metadata = Base.metadata
이 다음부터는 모델의 스키마가 변경될 때마다 명령프롬프트에서 입력해 줘야 한다.
alembic revision --autogenerate
위 명령을 실행하면 versions 폴더에 해당 버전의 스크립트 파일이 생성된다.
이 스크립트를 db에 적용하기 위해
alembic upgrade head
명령을 실행해 준다.
DB에 접속하여 변경사항을 확인해 본다.
잘 되었기를 바란다.
2023.09.12 - [FastAPI] - alembic 에서 스키마를 잘못 적용되었을때
alembic 에서 스키마를 잘못 적용되었을때
class 스키마를 만들고 > alembic revision --autogenerate -m "Change description" 실행 후 > alembic upgrade head 를 했는데 에러가 나면 프로젝트 폴더에 migration/version 폴더를 찾아가 해당 파일을 직접 지워주면 됨
lo9ger.tistory.com
.
※
head 부분은 가장 최신 스크립트를 적용하라는 건데
현재 버전을 확인하는 방법은
> alembic current
히스토리를 보고 싶으면
> alembic history
등의 명령어가 있다.
'FastAPI' 카테고리의 다른 글
sqlalchemy 기본값 설정하기(mariadb, mysql) (0) | 2024.08.22 |
---|---|
alembic, db_url 환경변수에서 가져오기 (0) | 2023.12.10 |
alembic 에서 스키마를 잘못 적용되었을때 (0) | 2023.09.12 |
alembic의 columns 타입이 변경되었을때 적용하기. (0) | 2023.09.12 |