HOWTO · Django

Django에서 마지막 데이터베이스 마이그레이션 롤백

이 기사는 Django에서 마지막 데이터베이스 마이그레이션으로 되돌릴 수있는 방법에 대한 토론을 제공합니다.

이 페이지의 내용

마지막으로 적용된 Django 마이그레이션을 되돌리려면 python manage.py migrate <app_label> <migration_name>을 실행하고, 되돌린 뒤에도 적용된 상태로 남길 마이그레이션을 지정하세요. 일반적으로 되돌리려는 마이그레이션 바로 앞의 항목입니다. Django는 지정한 앱에서 해당 대상 이후의 마이그레이션을 되돌립니다. 먼저 showmigrations로 앱의 현재 상태를 확인하세요. 스키마 작업을 되돌리면 데이터가 삭제될 수 있고 일부 작업은 되돌릴 수 없으므로, 롤백 전에 중요한 데이터를 백업하세요.

특정 마이그레이션까지 롤백하기

python manage.py showmigrations <app_label>을 실행하면 앱의 마이그레이션 목록을 볼 수 있습니다. 적용된 마이그레이션에는 [X], 적용되지 않은 마이그레이션에는 [ ]가 표시됩니다. 앱 레이블은 마이그레이션 명령에 사용하는 Django 애플리케이션 이름이며, 마이그레이션 이름은 .py를 뺀 파일 이름 부분입니다.

예를 들어 blog에 0001_initial, 0002_add_author, 0003_remove_legacy_field가 있고 세 마이그레이션이 모두 적용되어 있다고 가정해 보겠습니다. 0003_remove_legacy_field만 되돌리려면 대상으로 0002_add_author를 지정합니다: python manage.py migrate blog 0002_add_author. 대상은 되돌릴 마이그레이션이 아니라 최종적으로 유지할 마이그레이션 상태를 뜻합니다. Django는 blog에서 0003과 그 이후에 적용된 마이그레이션을 되돌립니다. 0002처럼 숫자 접두사만으로 대상을 지정할 수도 있지만, 전체 이름을 사용하면 선택한 항목이 더 분명합니다.

manage.py가 올바른 설정과 데이터베이스 연결을 불러올 수 있는 프로젝트 환경에서 명령을 실행하세요. 특히 여러 환경을 설정해 두었다면 진행하기 전에 대상 앱과 데이터베이스가 맞는지 확인하세요.

앱과 대상을 지정하는 명령을 출력하려면 다음 Python 코드를 실행하세요:

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

app_label = "blog"
target = "0002_add_author"
print(f"python manage.py migrate {app_label} {target}")
python manage.py migrate blog 0002_add_author

이 예제의 코드와 출력되는 명령은 영어로 표시됩니다. 이 코드는 명령 형식만 만들어 줍니다. 데이터베이스 상태를 바꾸려면 출력된 명령을 Django 프로젝트에서 실행하세요.

앱의 모든 마이그레이션 롤백하기

앱 하나에 적용된 모든 마이그레이션을 되돌리려면 python manage.py migrate <app_label> zero를 사용합니다. 예를 들면 python manage.py migrate blog zero와 같습니다. 여기서 zero는 해당 앱에 적용된 마이그레이션이 하나도 없는 상태를 가리킵니다. Django는 앱의 마이그레이션 이력을 역순으로 되돌립니다. 이는 “가장 최근 마이그레이션 하나를 되돌리는 것”과 다르며, 테이블이나 열과 그 데이터가 삭제될 수 있습니다. 이 대상을 사용하기 전에 앱의 마이그레이션 목록을 확인하고 데이터베이스를 백업하세요.

일부 마이그레이션만 되돌리려면 더 이전의 마이그레이션을 대상으로 지정하세요. Django는 현재 적용된 상태에서 거꾸로 진행해 그 대상에 도달합니다. 전체 프로젝트의 마이그레이션 이력에서 더 뒤에 있다는 이유만으로 다른 앱의 마이그레이션까지 선택되지는 않지만, 의존성이 실행 계획에 영향을 줄 수 있습니다. 프로덕션 환경을 변경하기 전에 Django가 계획한 작업을 확인하세요.

되돌릴 수 있는 작업과 데이터 손실 이해하기

마이그레이션에 역방향 작업이 정의되어 있거나 Django가 이를 추론할 수 있으면 해당 작업을 되돌릴 수 있습니다. 역방향 함수가 없는 사용자 지정 Python 작업으로 데이터를 삭제하는 경우처럼, 일부 작업은 원래 상태를 복원할 수 없습니다. 이런 마이그레이션을 되돌리려고 하면 IrreversibleError가 발생합니다. 어느 단계에 역방향 경로가 없는지 확인하려면 마이그레이션의 작업과 전체 오류 메시지를 살펴보세요. 이전 마이그레이션 파일을 복원하면 데이터베이스에 적용된 변경도 되돌릴 수 있다고 가정하지 마세요.

되돌릴 수 있는 스키마 변경도 데이터를 잃게 할 수 있습니다. 예를 들어 필드 삭제를 되돌려도 필드를 삭제할 때 이미 버려진 값은 복구되지 않습니다. 롤백 전에 데이터베이스를 백업하고, 애플리케이션의 쓰기 작업을 일시 중지해야 하는지 확인하세요. 앞으로 수정하는 편이 더 안전한지도 검토해야 합니다. 프로덕션에서는 최근 백업을 사용해 절차를 미리 연습하고 실제 데이터베이스를 변경하기 전에 복구 계획을 확인하세요.

Git은 마이그레이션 소스 파일을 관리하고, migrate는 데이터베이스 상태를 변경합니다. Git 커밋을 체크아웃하거나 되돌리는 것만으로 데이터베이스가 롤백되지는 않습니다. 마이그레이션 파일을 별도로 복원하면 코드와 데이터베이스에 기록된 마이그레이션 이력이 서로 맞지 않을 수도 있습니다. 데이터베이스 작업에는 Django의 마이그레이션 명령을 사용하고 코드 복구는 별도로 조율하세요.

데이터베이스 상태 확인하기

명령이 끝나면 python manage.py showmigrations <app_label>을 다시 실행하세요. 의도한 대상과 그 이전의 마이그레이션에 [X]가 표시되고, 되돌린 마이그레이션에는 [ ]가 표시되는지 확인합니다. 이 명령은 Django에 기록된 마이그레이션 상태를 보여 줍니다. 애플리케이션 수준의 모든 데이터 요구사항을 확인하거나 스키마와 데이터의 정상 상태를 증명하지는 않습니다. 영향을 받은 애플리케이션이 제대로 동작하는지 확인하고, 필요하면 데이터베이스를 살펴보거나 프로젝트별 검사를 실행하세요.

표시된 상태가 의도한 대상과 다르면 추가 롤백을 실행하기 전에 멈추세요. 올바른 데이터베이스에 연결되어 있는지 확인하고 명령 출력과 마이그레이션 의존성을 검토한 다음, 실제로 기록된 상태에 따라 다음 마이그레이션 작업을 결정하세요.