alembic migration을 merge 해 봅시다.

웹/FASTAPI 2023. 2. 1. 05:20

 다른 사람과 협업을 할 때, 충돌이 나는 경우가 적지 않게 있습니다. migration도 마찬가지입니다. 이러한 경우를 대비해서, 마이그레이션을 merge 할 수 있는 방법이 alembic에도 있습니다. 1.9.1 버전으로 실습하였으니 참고 부탁드립니다.

 


 먼저, test1 브랜치에서, table a에 revision을 추가한 상태입니다.

 

 다음에, test2 브랜치에서는 table b에 revision을 추가한 상태입니다. 마이그레이션이 충돌이 났습니다? 충돌이 났다는 의미는 여러 head가 있다는 의미입니다. branch가 여러 개 있다는 것입니다.

 

 현재 제 상황입니다. merge를 했더니, 0002가 2개 들어온 상황입니다. 왠지 충돌이 일어난 듯 합니다? alembic branches 명령어를 입력해서, 브랜치들을 모두 보겠습니다.

 

 뭔가 여러 개가 보입니다? 하나씩 보겠습니다. 먼저, 6fc1f5c56c2d가 branch point라고 되어 있어요. 이를 기점으로 2개의 head가 갈라졌는데요. b5db..랑 369d.. 입니다. b5db..랑, 369b.. 를 열어보겠습니다.

 

 down_revision을 보면, 6fc1.. 이라고 되어 있어요.

 

 369b..를 열어보니, down_revision이 6fc1.. 로 되어 있어요. 즉, 6fc1.. 버전에서 2개의 가지로 뻗어나온 셈입니다. 하나는 A 테이블에 revision을 추가하고, 다른 하나는 B 테이블에 revision을 추가했습니다.

 


 현재 제 head를 보기 위해 alembic current를 입력하겠습니다. 369b23... 이 나오는데요. 이 마이그레이션 파일을 열어보면, 테이블 b에 revision을 추가한 것임을 볼 수 있어요. 즉, 현재 제 상태는 table b에 revision이 추가된 상태입니다. 다른 사람의 것과 마이그레이션 할 때 버전 체크는 해 두시는 게 좋습니다.

 

 다음에, alembic upgrade head를 해 보겠습니다. 당연하게도 안 됩니다. Multiple head가 있기 때문입니다. 그러니, merge를 해 주어야 합니다. merge를 할 때, revision hash들을 개개별로 넘겨줄 수도 있고, 아예 넘겨주지 않을 수도 있습니다. 아예 넘겨주지 않으면, 모든 branch들을 합치게 됩니다. 

 

 전자의 방법은 위와 같이 하시면 됩니다. alembic merge -m 메세지 commit ... 형식으로 넘겨주면 됩니다. 저는 후자의 방법으로 하겠습니다.

 

 

 alembic merge heads를 입력하면 모든 branch들을 merge하는 마이그레이션 파일을 생성합니다. 생성된 파일을 보겠습니다.

 

 upgrade와 downgrade에 아무 것도 없습니다. 이는 아무것도 수행하지 않음을 의미해요. 대신에, A 다음에 B를 수행한다는 의존도를 나타내기 위한 마이그레이션임을 알 수 있어요. down_revision에 '369b...' 와 'b5dbb...' 가 있는 것을 보면 알 수 있습니다.

 

 

 이제 alembic upgrade head를 입력하면, 마이그레이션이 잘 동작함을 알 수 있습니다.

 

 

 정말 잘 들어갔는지 확인해 보니, revision 컬럼이 두 테이블에 잘 들어갔음을 알 수 있습니다. 이들이 동작하는 원리는 문서의 merge mechanics를 보면 topology sort (위상 정렬)을 이용한다고 되어 있습니다. 코딩 테스트를 준비하셨다면 많이 들어보셨을 테니 익혀두셔도 나쁘지 않을 듯 싶습니다.