본문 바로가기
FastAPI

alembic 사용 방법

by eit8 2023. 12. 10.

개인적인 글이라 친절하지 못합니다. 궁금하신점이 있으면 댓글로 부탁드립니다.

 

 

아주 매력적인 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

등의 명령어가 있다.