Django migrate 잘 사용하기

Django migrate 잘 사용하기

장고의 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

마이그레이션에 실행된 쿼리문을 확인할 수 있는 명령어다.

이 글이 도움이 되었나요?

신고하기