장고에서 모델 column 속성을 바꿀 일이 제법 있었습니다. 그 중, varchar의 길이를 조절하는 것도 적지 않았습니다. 그런데, 따로 alembic에서 설정을 해 주지 않으면, String의 길이가 바뀐 것을 detect 하지 않습니다. 그래서, 당황할 수 있는데요. 어떻게 해결할 수 있는지 문서를 통해서 보도록 하겠습니다. 1.9.1 버전 기준으로 작성되었으니 참고 부탁드립니다.

 


 먼저, 길이 제한이 200인 review 컬럼을 추가합니다. alembic으로 autogenerate 옵션을 주어서 마이그레이션 파일을 만들면, 아래와 같은 파일이 생성됩니다.

 

 

 이는, alembic에서 컬럼이 추가되면 change detect를 했다는 의미입니다. 이는 문서의 Autogenerate will detect. 부분의 2번째, Column additions, removals를 보면 알 수 있습니다. review라는 컬럼이 추가되었기 때문에 감지한 셈입니다. 이제, 이 review 컬럼의 길이를 200에서 160으로 바꿔 보도록 하겠습니다.

 

 장고에서는 요래 바꾸고 makemigrations를 하면 200에서 160으로 바꾸라는 명령이 들어갑니다. alembic에서는 어떨까요? 기본적으로 그렇지 않는다고 되어 있습니다. Autogenerate will detect의 5가지 항목에 나와 있는 것에 속하지 않는 것을 보면 알 수 있습니다. 정말 그런지 확인해 보겠습니다.

 

 

 alembic check를 입력해 봅시다. no new upgrade operations detected. 라고 되어 있습니다. 이는 아무런 변화가 없다는 것을 의미합니다. 뭔가 이상합니다. 저는 분명 reviews의 길이 제한을 200에서 160으로 바꿨는데 말입니다.

 


 이러한 변화를 감지하기 위해, compare_type 옵션을 킬 필요가 있습니다. env.py에 context.configure 함수를 호출하는 코드가 있습니다. 이 부분에서 compare_type=True로 설정해 주겠습니다.

 

 50번째 줄의 context.configure를 봅시다. compare_type=True를 집어넣었습니다.

 

 

 다음, 77번째 줄에 있는 context.configure 부분에도 compare_type=True를 넣어주었습니다. 그리고 나서 다시 alembic check를 수행해 보겠습니다.

 

 

 그랬더니, 이번에는 Detected type change 되었다고 합니다. 길이 제한이 200이였는데 160으로 줄었기 때문입니다. 마이그레이션 파일을 만든 뒤에, 정말 바뀌었는지 보겠습니다.

 

 4번 마이그레이션 파일입니다. alter_column이 눈에 보입니다. review라는 컬럼을 바꾸는데, 현재 길이가 200인 varchar에서, 160으로 바꾼다고 되어 있어요.

 

 

 해당 마이그레이션을 적용하기 전에 review 컬럼의 Data type은 varchar(200)이였습니다. 적용시킨 후에는 어떻게 바뀔까요?

 

 놀랍게도 varchar(160)으로 바뀝니다. 이제, 왜 compare_type=True 조건을 주면 요래 바뀌는지 문서를 보면서 알아보도록 하겠습니다.

 


 먼저 문서의 Notes를 봅시다. 2가지 과정이 나와 있습니다.

 

 base type을 비교하고, argument를 비교합니다. 이 argument들은 string의 경우 length가 될 수 있다는 예제까지 함께 언급하고 있습니다. string(200)에서 string(160)으로 review column의 정의가 변했는데요. 이를 어떻게 detect 했는지 상황을 그려보겠습니다.

 

 

 먼저, review가 바뀌기 전과 후에 base type은 varchar (string)으로 같았습니다. 고로, 이 단계에서 detect 되지 않았을 겁니다. 결정적인 것은, base type argument입니다. string의 경우, length가 될 수 있습니다. 이것은 바뀌기 이전에 200이였는데 바뀐 후에 160이였습니다.

 

 

 고로, 변화가 detect 되어버렸습니다. 그래서 길이가 변한 경우에도 migration 파일이 생성되게 됩니다.