HOWTO · Django
Django에서 마이그레이션 재설정
Django에서 마이그레이션을 재설정하는 방법 알아보기
이 페이지의 내용
Django 마이그레이션은 데이터베이스 스키마를 변경하기 위한 버전 관리 지침입니다. Django는 어떤 마이그레이션이 데이터베이스에 적용되었는지도 기록합니다. 따라서 “마이그레이션 재설정”은 여러 작업을 뜻할 수 있습니다. 앱 하나를 지정한 마이그레이션으로 되돌리거나, 해당 앱의 마이그레이션을 모두 적용 취소하거나, 스키마는 유지한 채 행을 비우거나, 개발 데이터베이스를 교체하는 작업입니다. 필요한 결과에 맞춰 작업을 선택하세요. 마이그레이션 파일을 삭제하는 것은 이 작업들을 대신할 수 없습니다.
데이터를 파괴할 수 있는 작업을 하기 전에 명령이 사용할 설정 파일과 데이터베이스를 확인하고, python manage.py showmigrations로 현재 마이그레이션 상태를 살펴보세요. 데이터가 중요하다면 복원할 수 있는 백업을 만드세요. 아래 명령에서 AppName은 blog와 같은 앱 라벨을 나타내는 자리표시자입니다. Python 패키지의 전체 경로가 아니라 Django가 인식하는 라벨을 사용하세요.
마이그레이션 재설정으로 바뀌는 것
마이그레이션 파일은 스키마 작업을 정의하며 데이터를 이동하거나 변환할 수도 있습니다. 마이그레이션 테이블에는 적용된 마이그레이션 이름이 기록됩니다. 앱을 롤백하면 가능한 경우 되돌리기 작업을 실행해 기록된 스키마 상태가 바뀌지만, 마이그레이션 파일 자체는 수정되지 않습니다. flush로 행을 비우면 스키마와 마이그레이션 기록은 그대로 남습니다. 개발 데이터베이스를 교체하면 데이터와 마이그레이션 기록이 제거되므로, 이후 마이그레이션을 다시 적용해야 합니다.
각 작업의 범위는 서로 다릅니다. 최근 스키마 변경을 되돌리려면 이전 마이그레이션을 지정하세요. 앱에 적용된 마이그레이션이 하나도 없는 상태로 만들려면 zero를 지정하세요. 애플리케이션 데이터만 비우려면 flush를 사용하세요. 로컬 데이터베이스를 버려도 되고 깨끗하게 다시 만들고 싶다면 데이터베이스를 교체한 뒤 프로젝트의 마이그레이션을 다시 적용하세요. 데이터베이스가 재설정된 것처럼 보이게 하려고 마이그레이션 파일을 삭제하지 마세요. 기존 환경과 팀원도 공유된 마이그레이션 기록을 정의하는 파일에 의존합니다.
앱 하나를 이전 마이그레이션으로 롤백하기
showmigrations AppName으로 대상 마이그레이션을 찾거나 해당 앱의 마이그레이션 파일을 살펴보세요. 그런 다음 python manage.py migrate AppName 0004를 사용하면 앱이 0004 마이그레이션 상태로 이동합니다. 두 자리표시자를 실제 앱 라벨과 대상으로 바꾸세요. 마이그레이션 이름이 initial처럼 표시되어 있다면 숫자 대신 그 이름을 사용할 수도 있습니다.
대상 마이그레이션이 적용된 직후의 상태로 돌아가므로, 해당 앱의 이후 마이그레이션은 되돌려집니다. 되돌리기 작업은 열을 변경하거나 제거할 수 있고, 그 열에 저장된 데이터도 삭제할 수 있습니다. 마이그레이션 그래프를 일관되게 유지하기 위해 Django가 종속된 마이그레이션도 조정해야 할 수 있습니다. 특히 다른 앱이 대상 앱에 의존한다면 명령을 실행하기 전에 예정된 변경 사항과 활성 설정이 가리키는 데이터베이스를 확인하세요.
간단한 Python 코드 조각으로 프로젝트에 맞게 수정하기 전 명령 템플릿을 명확히 만들 수 있습니다. 예시 앱과 대상을 자신의 마이그레이션 목록에 있는 값으로 바꾸세요.
이 예제를 실행하세요:
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
app_label = "blog"
target_migration = "0004"
print(f"python manage.py migrate {app_label} {target_migration}")
python manage.py migrate blog 0004
이 코드는 명령 템플릿을 출력할 뿐이며 Django에 연결하거나 데이터베이스를 변경하지 않습니다.
앱 하나를 zero 상태로 재설정하기
앱 하나의 마이그레이션을 모두 적용 취소하려면 python manage.py migrate AppName zero를 사용하세요. 이 명령은 해당 앱의 마이그레이션 상태에만 영향을 주고 스키마 작업을 되돌립니다. 데이터베이스 전체를 재설정하는 명령은 아닙니다. 마이그레이션과 관계에 따라 테이블이나 데이터가 제거될 수 있으며, 종속된 마이그레이션도 적용 취소해야 할 수 있습니다. 결과가 확실하지 않다면 먼저 폐기해도 되는 환경에서 예상되는 영향을 살펴보세요.
공유되거나 배포된 프로젝트에서는 이 명령 다음에 앱의 마이그레이션 파일을 삭제하지 마세요. 다른 데이터베이스에서 스키마를 구성할 때 Django가 사용하는 기록이 바로 그 파일입니다. 팀에서 의도적으로 마이그레이션을 압축하거나 기록을 교체하려는 경우, zero를 해당 기록을 지워도 된다는 뜻으로 간주하지 말고 모든 환경을 아우르는 별도의 마이그레이션 유지 관리 절차를 조율하세요.
개발 데이터베이스 재설정하기
테이블과 적용된 마이그레이션은 유지하면서 데이터베이스를 비우려면 python manage.py flush를 실행하세요. 이 명령은 데이터베이스의 데이터를 삭제하고 시퀀스를 재설정하지만 스키마와 마이그레이션 기록은 유지합니다. 픽스처를 다시 불러오거나 애플리케이션 데이터를 비우려는 경우에 주로 적합합니다. 마이그레이션 파일로 스키마를 다시 만드는 명령은 아닙니다.
로컬 데이터베이스를 완전히 다시 만들려면 데이터베이스를 사용하는 프로세스를 중지하고, 활성 설정이 폐기해도 되는 개발 데이터베이스를 가리키는지 확인한 다음 데이터베이스 엔진에 맞는 절차로 데이터베이스를 교체하세요. SQLite에서는 로컬 데이터베이스 파일을 삭제할 수 있습니다. 서버 데이터베이스에서는 적절한 자격 증명을 사용해 개발 데이터베이스를 삭제하고 다시 만드는 경우가 많습니다. 그다음 python manage.py migrate를 실행해 스키마를 만들고 프로젝트의 마이그레이션을 적용하세요. 데이터베이스 삭제 명령은 엔진마다 다르므로 해당 데이터베이스에 문서화된 절차를 따르세요. 명확한 복구 계획 없이 개발 데이터베이스 재설정 명령을 프로덕션에 사용하지 마세요.
마이그레이션 파일을 제거하고 현재 모델에서 새 파일을 만드는 것은 별도로 조율해야 하는 기록 재작성 작업입니다. 로컬 데이터베이스를 성공적으로 다시 만들었더라도 배포된 설치 환경, 팀원의 작업 사본, 마이그레이션 종속성이 손상될 수 있습니다. 마이그레이션 파일을 버전 관리에 보관하고 일반적인 모델 변경에는 새 마이그레이션을 사용하세요.
되돌릴 수 없는 마이그레이션을 안전하게 처리하기
일부 마이그레이션은 정보를 버리거나 정의된 되돌리기 작업이 없어서 역방향으로 적용할 수 없습니다. Django는 IrreversibleError와 함께 롤백을 중단할 수 있습니다. 실패 후 데이터베이스 상태는 마이그레이션의 원자성과 데이터베이스의 트랜잭션 동작에 따라 달라집니다. 롤백 과정에서 일부 변경만 적용될 수도 있습니다. 롤백 명령을 실행하면 삭제되거나 변환된 데이터가 복원된다고 가정하지 마세요.
롤백을 시도하기 전에 마이그레이션 작업을 살펴보고 보존해야 할 데이터를 백업하세요. 최근 데이터베이스 사본에서 롤백을 시험하고, 결과 스키마와 중요한 레코드를 확인한 다음, 적용 직전에 대상 환경을 다시 확인하세요. 마이그레이션을 되돌릴 수 없다면 적절한 백업에서 복원하거나 원하는 상태로 만드는 의도적인 순방향 마이그레이션을 작성하세요. 불일치를 숨기려고 마이그레이션 기록을 직접 삭제하지 마세요.