fastapi에서 model 여러개를 하나의 모델 파일에 정의하는 것은 그렇게 좋지 못한 듯 합니다. 너무 길어지고, 한 파일에 책임이 너무나도 많기 때문입니다. 도메인에 따라, 혹은 역할에 따라 분리하는 것이 필요한데요. 그렇다는 것은 여러 개의 파일로 분리해야 한다는 것을 의미해요.

 

 alembic에서 multiple target metadata를 인식하게 하는 방법을 알아봅시다. alembic 1.9.2 기준으로 실습했음을 미리 알려드립니다.

 


 먼저 프로젝트의 구조입니다. models 안에 __init__.py와 model_a.py, model_b.py가 있습니다. 다음에, env.py가 있습니다. 저는 이 4개의 파일만 건드릴 겁니다.

 

 먼저, model_a.py입니다. a_base에 모델 a가 연관되어 있습니다.

 

 다음에, model_b.py입니다. b_base에 모델 b가 연관되어 있습니다. 우리는 이제 이 두 개의 base 각각에 대해 target metadata 얻어와서 alembic의 마이그레이션 도구가 인식하게 해야 해요. 어떻게 해야 할까요? 문서를 보면, base의 metadata들을 저장한 배열들을 넘겨주면 됨을 알 수 있습니다. 이제 __init__.py를 보겠습니다.

 

 app.models.model_a로부터 a_base를, app.models.model_b로부터 b_base를 얻어옵니다. 이 둘의 metadata들을 얻어와서 리스트 alembic_meta_data에 저장합니다. a_base.metadata, b_base.metadata가 되겠군요. 이제 이 정보들을 어디에 쓰면 될까요? env.py에 target_metadata에 넣어주기만 하면 됩니다.

 

 

 29번째 줄을 보시면 되겠습니다.

 


 이제 변경점이 있는지 체크해 봅시다. poetry run alembic check를 입력해 봅시다. 그러면, 뭔가 정보가 뜨면서 Detected ... 가 떨어짐을 알 수 있어요. 이를 토대로 무언가 변경 사항이 있구나. 라는 것을 눈치챌 수 있습니다.

 

 revision --autogenerate -m으로 마이그레이션 파일을 생성해 보겠습니다. 그러면, 뭔가 파일이 하나 생성되었음을 볼 수 있습니다.

 

 해당 마이그레이션 파일의 upgrade 메소드를 보겠습니다. 그러면, 테이블 a를 생성한다. 테이블 b를 생성한다. 라는 명령을 수행하고 있어요. 제가 원하던 바를 수행하고 있어요.

 

 확인까지 했으니, 이제 alembic upgrade head로 마이그레이션을 해 보겠습니다.

 

 

a의 컬럼에 id와 description이 있습니다. b의 컬럼에도 id와 description이 있습니다. 제대로 반영되었음을 알 수 있습니다.