장고의 migrate
명령어에 익숙치 않아 테이블 업데이트가 있으면 데이터를 덤프로 빼서 db를 지우고 syncdb
옵션으로 재생성을 진행했었다. 데이터가 별로 없을때는 비교적 짧은 시간안에 완료되어 큰 문제가 되지 않았다. 또한 초기에는 스키마 변경이 많지 않아서 필요성을 크게 느끼지 못했다.
장고의 migrate
명령어에 익숙치 않아 테이블 업데이트가 있으면 데이터를 덤프로 빼서 db를 지우고 syncdb
옵션으로 재생성을 진행했었다. 데이터가 별로 없을때는 비교적 짧은 시간안에 완료되어 큰 문제가 되지 않았다. 또한 초기에는 스키마 변경이 많지 않아서 필요성을 크게 느끼지 못했다.
그러나 데이터가 점차 많아지면서 시간이 길어졌고 데이터 변경이 필요할때 주저하게 되다보니 이 과정 자체가 큰 스트레스가 되었다. 이번 기회에 개념을 바로 잡아 올바르게 사용하려고 한다. 지금은 스트레스가 사라져 재밌게 느껴지기까지 하였다. (이래서 처음 배울 때 잘 배워야 하나보다)
장고에서는 위에서 겪지 말아야 스트레스를 해결해 주는 기능들이 존재한다. 가장 핵심적으로 migrate
명령어가 있는데 이것은 모델 클래스 코드를 수정하고 명령어를 실행하는 것만으로 데이터베이스 스키마를 쉽게 변경할 수 있고, 스키마 변경에 의한 데이터 손실을 줄여 개발 효율성을 높혀준다.
python manage.py migrate
migrate
명령은 기본적으로 위와 같이 실행한다. 데이터베이스 스키마 변경뿐만 아니라, 마이그레이션 파일의 순서 및 의존성도 파악하여 적절하게 처리한다.
python manage.py migrate --run-syncdb
필자가 위에서 언급했던 --run-syncdb
옵션은 마이그레이션 파일을 생성하지 않고 데이터베이스에 스키마를 바로 생성한다. 이 옵션은 초기에 데이터베이스를 셋팅하거나, 마이그레이션 파일이 정말 필요하지 않거나, 개발하는 상황에서 사용할 수 있다. 개발 환경이 아닌 데이터베이스가 이미 생성된 환경인 경우 사용에 각별한 주의가 필요하다. (백업 권장, 데이터가 유실될 위험이 있다)
python manage.py migrate --fake
--fake
옵션은 migrate
명령어를 실행할 때, 마이그레이션을 가짜로 실행하는 옵션이다. 이 옵션을 사용하면 마이그레이션을 실제로 실행하지 않고, 마이그레이션 실행에 대한 레코드만 데이터베이스에 기록한다. 따라서, 데이터베이스 스키마는 변경되지 않지만, migrate
명령어는 마이그레이션을 실행했다는 것을 기록한다.
이 옵션은 데이터베이스가 이미 최신 상태인 경우에 사용할 수 있다. 필자의 현재 상황에서 아주 적절하게 사용할 수 있는 옵션이다. 하지만 스키마와 모델간의 불일치를 유발할 수 있으므로, 데이터베이스가 모델 파일과 정말 일치하는 상태인지 철저하게 확인하여 사용할 필요가 있다. (백업 권장)
python manage.py migrate <app> zero
위 명령어를 실행하면 해당 앱에서 수행된 모든 마이그레이션 파일이 취소되어, 데이터베이스 스키마가 초기 상태로 되돌아간다. 이 명령어는 마이그레이션을 되돌리는 것이므로 주의해서 사용해야 한다. zero
대신 마이그레이션의 번호를 입력하면 해당 마이그레이션으로 되돌린다. (백업 권장)
makemigrations
명령어를 실행하면 현재 모델 클래스의 변경사항에 대한 마이그레이션 파일이 생성된다. 이 마이그레이션 파일은 데이터베이스 스키마를 변경하는 SQL 구문이 포함된다. 이 파일은 데이터베이스 스키마의 변경 이력을 관리하는데 사용된다.
만약 필자처럼 마이그레이션 파일을 유지하지 않는 만행을 저질렀다거나, 중간에 마이그레이션 파일을 삭제한 경우 데이터베이스 스키마와 일치성이 깨지게 된다. 따라서 마이그레이션 파일은 꼭 유지하도록 하자. 만약 유지하지 않았던 상태라면:
# 모델 파일이 DB 상태와 동일한 상태에서
python manage.py makemigrations <app>
python manage.py migrate --fake
# 모델 파일을 필요한 상태로 수정한 후
python manage.py makemigrations
python manage.py migrate
python manage.py showmigrations
admin
[X] 0001_initial
[X] 0002_logentry_remove_auto_add
[X] 0003_logentry_add_action_flag_choic
마이그레이션의 상태를 확인할 수 있는 명령이다.
python manage.py sqlmigrate <app> 0001
마이그레이션에 실행된 쿼리문을 확인할 수 있는 명령어다.
이 글이 도움이 되었나요?
Ghost