alembic으로 migration을 하다 보면 이상한 코드가 먼저 나옴을 알 수 있습니다. 마이그레이션 파일을 관리할 때 먼저 생성된 파일이 위에 오면 편할 겁니다. 어떻게 하면 좋을까요? 예를 들어, 0001_xxx, 0002_xxx 순으로 오게 하고 싶다면요? 그렇게 하면 버전 관리가 보다 편해질 겁니다.

 


 alembic revision --autogenerate -m "init_script"를 쳐 보겠습니다.

 

 그러면 앞에 fbe53.. 이 생성됨을 볼 수 있습니다. 랜덤하게 생성된 문자열이기 때문에 보기가 영 편하지 않습니다. 문서를 보면, context의 configure의 process_revision_directives는 "revision" --autogenerate 옵션일 때 트리거가 된다고 합니다.

 

 

 그 전에 ScriptDirectory에 대한 설명을 봅시다. 이것은 current revision을 얻어오기에 매우 유용하다고 설명이 되어 있습니다. 위와 같이 얻어온다고 되어 있습니다. 이를 응용하면 아래 코드와 같이 작성하실 수 있습니다.

 

 요러한데요. 간단하게 소개만 하겠습니다. context와 directives가 중요합니다. context는 현재 head의 버전을 가지고 오기 위함입니다. 42번째 줄에 head_revision이라고 가져옴을 볼 수 있습니다. 다음에, new_rev_id를 생성하는데요. head_revision이 없는 경우는 아직 마이그레이션 파일이 아무것도 없는 경우입니다.

 

 고로, 이 경우에는 1번을 표기해야 합니다. 그렇지 않으면 000x_{uuid}꼴이라면 앞에 4자리만 가져오면 되겠지요. 44번째 줄에 보면, int(head_revision[:4])를 볼 수 있는데요. 이는 앞에 수 4개만 끊어오는 것입니다. 다음 45번째 줄은 migration_script의 rev_id에 무언가를 집어넣는 것입니다. 버전 번호에 uuid4를 추가함을 볼 수 있습니다. 이는, alembic에서는 앞에 revision으로 head 등을 판별하기 때문입니다.

 

 

 이 rev_id는 겹치지 않게 구분짓는 게 중요합니다. 저는 뒤에 uuid가 오게 하였습니다. 이제 남은 것은 migration_script.rev_id 부분입니다. 이는 문서의 마지막 부분을 보면 대략적으로 유추할 수 있습니다. autogenerate를 할 때 이 부분의 속성들을 건드리면 새로운 버전의 파일을 생성할 때 넘겨지는 파라미터 등을 변경할 수 있다.

 

 이로 미루어 보았을 때, 45번째 줄이 하는 것은 revision_id를 제가 원하는 이름인 000x_{uuid4}로 변경한다고 유추할 수 있습니다.

 

 다음에 run_migrations_offline의 process_revision_directives에 gen_revision을 추가해 줍니다. 이 함수는 제가 revision을 --autogenerate 하였을 때, 호출되는 함수입니다. 이 함수를 통해, 리비전이 custom하게 생성됩니다.

 

 run_migration_online도 수정합니다. context.configure 부분을 수정하시면 됩니다. 이제, alembic revision --autogenerate -m "message"로 마이그레이션 파일을 생성하겠습니다.

 

 

 그러면 요런 파일이 하나 생성됩니다. 0001_938e.. 이 부분입니다.

 


 이제 alembic_version 테이블을 보겠습니다.

 

 그러면 version_num이 0001_938e379a0cb5로 생성되었음을 볼 수 있습니다. 이게 revision id인 셈입니다. 당연하게도, 해당 방법은 revision --autogenerate 명령을 쓸 때에만 적용되기 때문에, merge를 할 때에는 적용되지 않습니다.

 

 

 굳이 수동으로 하려면, merge heads를 할 때 --rev-id 옵션을 주면 revision id를 커스텀하게 줄 수 있으니 이를 이용하면 되겠습니다.