본문 바로가기

코딩

django migration Reset

728x90
반응형

Django Migration Reset 완벽 가이드

1. Migration Reset이란?

🎯 Migration Reset의 정의

Django Migration Reset은 기존의 모든 마이그레이션 파일과 데이터베이스 스키마를 초기화하고, 새로운 마이그레이션을 처음부터 다시 생성하는 과정입니다.

🔄 언제 Migration Reset이 필요한가?

  • 복잡한 마이그레이션 충돌: 해결하기 어려운 마이그레이션 충돌이 발생했을 때
  • 모델 구조 대대적 변경: 기존 모델을 완전히 새로 설계할 때
  • 개발 초기 단계: 프로덕션 배포 전 개발 단계에서
  • 테스트 데이터 정리: 개발용 테스트 데이터를 완전히 초기화할 때
  • DB 스키마 최적화: 불필요한 마이그레이션 히스토리 정리

🚨 중요한 경고

Migration Reset은 모든 데이터를 삭제합니다. 운영 환경에서는 절대 함부로 실행하지 마세요!

2. 주의사항 및 백업

⚠️ Reset 전 필수 체크사항

  • 현재 환경이 개발용인지 다시 한번 확인
  • 중요한 데이터가 있는지 검토
  • 팀원들에게 Reset 계획 공유
  • 백업 계획 수립

💾 데이터 백업 방법

1 전체 데이터베이스 백업
# 전체 DB 덤프 python manage.py dumpdata > full_backup.json # 특정 앱만 백업 python manage.py dumpdata myapp > myapp_backup.json # 사용자 데이터만 백업 python manage.py dumpdata auth.user > users_backup.json # 날짜 포함 백업 파일명 python manage.py dumpdata > backup_$(date +%Y%m%d_%H%M%S).json
2 데이터베이스 파일 백업 (SQLite)
# SQLite 파일 복사 cp db.sqlite3 db_backup_$(date +%Y%m%d).sqlite3 # 압축해서 백업 tar -czf db_backup_$(date +%Y%m%d).tar.gz db.sqlite3
3 마이그레이션 파일 백업
# 모든 마이그레이션 파일 백업 find . -path "*/migrations/*.py" -not -name "__init__.py" | xargs tar -czf migrations_backup_$(date +%Y%m%d).tar.gz # 특정 앱의 마이그레이션만 백업 tar -czf myapp_migrations_backup.tar.gz myapp/migrations/

3. 개발 환경 Reset 방법

개발 환경에서 안전하게 Reset하는 방법들을 소개합니다.

🔄 방법 1: 완전 Reset (권장)
1 모든 마이그레이션 파일 삭제
# 모든 앱의 마이그레이션 파일 삭제 (__init__.py 제외) find . -path "*/migrations/*.py" -not -name "__init__.py" -delete find . -path "*/migrations/*.pyc" -delete # 또는 수동으로 각 앱별 삭제 rm myapp/migrations/0*.py rm anotherapp/migrations/0*.py
2 데이터베이스 삭제
# SQLite 사용시 rm db.sqlite3 # PostgreSQL 사용시 dropdb myproject_db createdb myproject_db # MySQL 사용시 mysql -u root -p -e "DROP DATABASE myproject_db; CREATE DATABASE myproject_db;"
3 새로운 마이그레이션 생성
# 새로운 초기 마이그레이션 생성 python manage.py makemigrations # 마이그레이션 적용 python manage.py migrate # 슈퍼유저 생성 python manage.py createsuperuser
⚡ 방법 2: 스크립트를 이용한 자동 Reset
1 Reset 스크립트 생성
#!/bin/bash # reset_migrations.sh echo "🚨 Django Migration Reset 시작..." # 백업 생성 echo "📦 백업 생성 중..." python manage.py dumpdata > backup_$(date +%Y%m%d_%H%M%S).json # 마이그레이션 파일 삭제 echo "🗑️ 마이그레이션 파일 삭제 중..." find . -path "*/migrations/*.py" -not -name "__init__.py" -delete find . -path "*/migrations/*.pyc" -delete # 데이터베이스 삭제 echo "🗄️ 데이터베이스 삭제 중..." rm -f db.sqlite3 # 새로운 마이그레이션 생성 echo "🔄 새로운 마이그레이션 생성 중..." python manage.py makemigrations python manage.py migrate echo "✅ Reset 완료!"
2 스크립트 실행
# 실행 권한 부여 chmod +x reset_migrations.sh # 스크립트 실행 ./reset_migrations.sh

4. 운영 환경 Reset 방법

🚨 운영 환경 주의사항

운영 환경에서는 절대 함부로 Reset하지 마세요. 다음 절차를 반드시 따르세요.

🔐 운영 환경 안전 Reset 절차
1 서비스 중단 및 백업
# 1. 웹서버 중단 sudo systemctl stop nginx sudo systemctl stop gunicorn # 2. 완전한 데이터베이스 백업 pg_dump myproject_db > production_backup_$(date +%Y%m%d_%H%M%S).sql # 3. Django 데이터 백업 python manage.py dumpdata > production_data_backup.json # 4. 미디어 파일 백업 tar -czf media_backup_$(date +%Y%m%d).tar.gz media/
2 점진적 마이그레이션 Reset
# 1. 현재 마이그레이션 상태 확인 python manage.py showmigrations # 2. 마이그레이션 기록만 초기화 (데이터 보존) python manage.py migrate --fake-initial # 3. 새로운 마이그레이션 생성 python manage.py makemigrations --empty --name reset_migration # 4. 신중하게 마이그레이션 적용 python manage.py migrate --dry-run # 먼저 시뮬레이션 python manage.py migrate
3 데이터 검증 및 서비스 재시작
# 1. 데이터 무결성 검증 python manage.py check python manage.py validate # 2. 테스트 실행 python manage.py test # 3. 서비스 재시작 sudo systemctl start gunicorn sudo systemctl start nginx # 4. 상태 확인 sudo systemctl status gunicorn sudo systemctl status nginx

⚠️ 운영 환경 대안 방법

  • Blue-Green 배포: 새로운 환경을 구축하여 전환
  • 스테이징 환경 테스트: 운영과 동일한 환경에서 먼저 테스트
  • 점진적 마이그레이션: 한 번에 모든 것을 변경하지 않기
  • 롤백 계획: 문제 발생 시 즉시 되돌릴 수 있는 계획

5. 특정 앱만 Reset하기

🎯 단일 앱 마이그레이션 Reset

전체 프로젝트가 아닌 특정 앱의 마이그레이션만 초기화하는 방법입니다.

📱 특정 앱 Reset 방법
1 해당 앱 데이터 백업
# 특정 앱 데이터만 백업 python manage.py dumpdata myapp > myapp_backup.json # 관련 테이블 확인 python manage.py dbshell .tables # SQLite \dt # PostgreSQL
2 앱을 초기 상태로 되돌리기
# 특정 앱을 초기 마이그레이션으로 되돌리기 python manage.py migrate myapp zero # 마이그레이션 파일 삭제 rm myapp/migrations/0*.py # 새로운 초기 마이그레이션 생성 python manage.py makemigrations myapp # 마이그레이션 적용 python manage.py migrate myapp
3 데이터 복원 (선택사항)
# 백업된 데이터 복원 (스키마가 호환될 경우) python manage.py loaddata myapp_backup.json # 또는 수동으로 필요한 데이터만 입력

💡 외래키 관계가 있는 앱 Reset 시 주의사항

  • 다른 앱과의 관계를 먼저 확인하세요
  • 참조하는 앱들도 함께 고려해야 합니다
  • 의존성 순서에 따라 Reset 순서를 정하세요

6. 문제 해결 및 복구

🚨 일반적인 문제들과 해결방법

❌ 문제 1: 마이그레이션 충돌
# 마이그레이션 충돌 해결 python manage.py makemigrations --merge # 충돌 파일 수동 편집 후 python manage.py migrate
❌ 문제 2: 외래키 제약조건 오류
# 외래키 체크 비활성화 (MySQL) python manage.py dbshell SET foreign_key_checks = 0; -- 작업 수행 SET foreign_key_checks = 1;
❌ 문제 3: 마이그레이션 파일 손상
# 손상된 마이그레이션 파일 건너뛰기 python manage.py migrate --fake myapp 0005 # 또는 완전히 새로 시작 python manage.py migrate myapp zero rm myapp/migrations/0*.py python manage.py makemigrations myapp

🔄 데이터 복구 방법

1 JSON 백업에서 복구
# 전체 데이터 복구 python manage.py loaddata backup_file.json # 특정 모델만 복구 python manage.py loaddata --app myapp backup_file.json
2 SQL 백업에서 복구
# PostgreSQL 복구 psql myproject_db < backup_file.sql # MySQL 복구 mysql -u username -p myproject_db < backup_file.sql
3 부분 데이터 복구
# 특정 테이블만 복구 python manage.py shell
# Django shell에서 import json from myapp.models import MyModel # JSON 파일에서 특정 데이터만 로드 with open('backup_file.json', 'r') as f: data = json.load(f) # 특정 모델 데이터만 필터링 및 복구 for item in data: if item['model'] == 'myapp.mymodel': obj, created = MyModel.objects.get_or_create( id=item['pk'], defaults=item['fields'] ) if created: print(f"복구됨: {obj}")

7. 완전 Reset 체크리스트

✅ Reset 전 체크리스트

  • □ 현재 환경이 개발/테스트 환경인지 확인
  • □ 중요한 데이터 백업 완료
  • □ 팀원들에게 Reset 계획 공유
  • □ 마이그레이션 파일 백업
  • □ 미디어 파일 백업 (필요시)
  • □ 환경 변수 및 설정 파일 백업
🔄 완전 Reset 스크립트
#!/bin/bash # complete_reset.sh - 완전한 Django 프로젝트 Reset set -e # 오류 발생시 스크립트 중단 echo "🚨 Django 프로젝트 완전 Reset 시작..." # 1. 백업 디렉토리 생성 BACKUP_DIR="backups/$(date +%Y%m%d_%H%M%S)" mkdir -p $BACKUP_DIR echo "📦 백업 생성 중..." # 2. 전체 데이터 백업 python manage.py dumpdata > $BACKUP_DIR/full_backup.json # 3. 마이그레이션 파일 백업 find . -path "*/migrations/*.py" -not -name "__init__.py" | xargs tar -czf $BACKUP_DIR/migrations_backup.tar.gz # 4. 데이터베이스 파일 백업 (SQLite인 경우) if [ -f "db.sqlite3" ]; then cp db.sqlite3 $BACKUP_DIR/ fi echo "🗑️ 기존 데이터 삭제 중..." # 5. 마이그레이션 파일 삭제 find . -path "*/migrations/*.py" -not -name "__init__.py" -delete find . -path "*/migrations/*.pyc" -delete # 6. 데이터베이스 삭제 rm -f db.sqlite3 # 7. __pycache__ 정리 find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true echo "🔄 새로운 환경 구성 중..." # 8. 새로운 마이그레이션 생성 python manage.py makemigrations # 9. 마이그레이션 적용 python manage.py migrate # 10. 슈퍼유저 생성 (자동) echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', 'admin@example.com', 'admin123') if not User.objects.filter(username='admin').exists() else None" | python manage.py shell echo "✅ Reset 완료!" echo "📁 백업 위치: $BACKUP_DIR" echo "👤 관리자 계정: admin / admin123" echo "🚀 서버 시작: python manage.py runserver"

✅ Reset 후 확인사항

  • □ 마이그레이션 상태 확인: python manage.py showmigrations
  • □ 모델 검증: python manage.py check
  • □ 테스트 실행: python manage.py test
  • □ Admin 페이지 접속 확인
  • □ 기본 기능 동작 확인
  • □ 필요한 초기 데이터 입력

💡 Reset 후 권장사항

  • 초기 데이터 설정: fixtures나 management commands로 기본 데이터 생성
  • 테스트 데이터 생성: 개발용 더미 데이터 준비
  • 문서 업데이트: 변경된 모델 구조 문서화
  • 팀 공유: 새로운 모델 구조를 팀원들과 공유

⚠️ 최종 주의사항

  • Reset은 되돌릴 수 없는 작업입니다
  • 운영 환경에서는 절대 함부로 실행하지 마세요
  • 항상 백업을 먼저 생성하세요
  • 팀원들과 충분히 상의 후 진행하세요
  • 스테이징 환경에서 먼저 테스트하세요

728x90
반응형