장고에서는 makemigrate와 migration으로 디비 스키마 구조가 바뀌었을 때 즉시 변경해서 배포할 수 있었습니다. fastapi에는 그런 기능이 없을까요? 검색해 보니 alembic 이라는 것이 있었는데요. 간단하게 세팅을 마쳐보도록 하겠습니다.

 


 먼저 실습이 완료된 프로젝트 구조부터 보고 가겠습니다.  루트에 models.py, Dockerfile, docker-compose.yml, .dockerignore, requirements.txt, alembic.ini가 있습니다. 그리고 ddl, migrates, app 패키지가 있는 구조입니다. migrates 안에 어떤 것이 있는지 보겠습니다.

 

 

 versions를 담은 정보와 env.py, README, script.py.mako가 있습니다. versions는 마이그레이션 파일들이 쌓이는 장소입니다. 그리고, 우리가 건드릴 파일은 사실 env.py 밖에 없습니다. 큰 그림은 여기까지 그려봅시다.

 

 

 pip나 poetry 등으로 alembic을 설치한 후에, alembic init migrates 명령어를 입력해 보겠습니다. 그러면, migrates 폴더 안에 이상한 여러 파일들과 폴더가 생성됩니다.

 

 

 이 중, env.py 파일만 건들겁니다.

 

 

 다음에, alembic.ini 파일도 생성됩니다. 이 파일도 조금 수정을 할 예정입니다.

 

 

 먼저, alembic.ini 파일을 보겠습니다. sqlalchemy.url이 있는데요. 아마도 기본 셋팅값이 있는듯 합니다. 이것을 쓸 리는 없으니 # 을 붙여서 주석처리 해 주겠습니다. 다음에 env.py 파일을 수정하기 전에, models.py를 보겠습니다. 프로젝트의 루트 폴더에 있습니다.

 

 

 models.py 파일입니다. ModelBase를 env.py에 import 할 겁니다. 쉽게 말해 선언한 모델들의 meta 데이터를 담고 있는 Base를 env.py에 임포트 시킬 겁니다.

 

 

 8번째 줄의 from models import ModelBase는 제 models.py에 있는 ModelBase를 얻어옵니다. 13번째 줄, set_main_option으로 sqlalchemy.url의 값을 설정합니다. database 접속 정보를 설정하는 것을 볼 수 있습니다.

 

 target_metadata를 설정하는 부분을 봅시다. 이 부분을 ModelBase.metadata로 바꿔줍시다. 이 부분은 model들의 MetaData를 넣으면 됩니다. 저는 models.py에 ModelBase에 선언한 모델들을 넣어놓았으니 ModelBase.metadata로 가져왔습니다.

 

 

 다음에 run_migrations_online 함수를 살짝 수정해 보겠습니다. 위에서 설정한 sqlalchemy.url을 얻어옵니다. 68번째 줄은 이를 수행합니다.

 

 다음, context.configure에 위에서 설정한 url을 인자로 집어넣습니다. 77번째 줄을 보시면 됩니다. 여기까지 하면 설정이 끝났습니다.

 


 이제, revision 명령어를 이용해서 마이그레이션 파일을 생성합시다. -m 옵션을 주는데요. 저는 "000X 어떤 일을 했는지" 정도의 포맷으로 작성하는 편입니다. 한 가지 중요한 점은, --autogenerate 옵션을 붙이는 것입니다. 마이그레이션 파일이 제대로 생성되었는지 어떻게 확인할까요?

 

 

 처음에 연결된 db에 테이블이고 뭐고 아무것도 없었던 경우에, test라는 것이 models.py에 정의되어 있었고, ModelBase에 연관되어 있었습니다. 그렇기 때문에, upgrade 함수를 보았을 때, op.create_table 등이 있어야 합니다. 만약에 없다면, 마이그레이션 파일이 제대로 생성된 게 아니겠지요. --autogenerate가 빠졌는지 다시 한 번 확인하세요.

 

 마이그레이션 파일이 잘 생성된 것을 확인했다면, alembic upgrade head로 실제 디비에 반영하면 됩니다.

 

 

 확인해 보면 제대로 생성되었음을 알 수 있습니다.