마이그레이션(Migration)은 무엇인가?
Django의 마이그레이션은 모델의 변경 사항을 DB 스키마로 전파하는 프로세스다. 사용자(User)가 모델을 변경(필드 추가 및 삭제)를 하면, 이를 데이터베이스 스키마에 적용하는 것을 목적으로 설계했다. 마이그레이션을 생성하면 그 시점의 파이그레이션 구조를 나타낸다. git과 같이 그 시점의 commit 상태라고 보면된다.
다시 말하면, 마이그레이션은 그 시점의 모델간의 모든 종속성(dependency)를 담고 있다고 보면 된다.
setting.py 적용하기
마이그레이션 관련 명령어를 적용하기 이전에 해야할 일이 있다. 그것은 settting.py에 app_name을 적용하는 것이다.
config/setting.py에 들어가서 INSTALLED_APPS에 app_name을 추가하면 된다.
# config/setting.py
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# (중략)
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app_name', # 설치되어 있는 app_name을 추가한다.
]
# (중략)
Migration 관련 명령어
명령어 | 설명 | 예 |
migrtaions | 모델의 변경 사항을 기반으로 새로운 마이그레이션 파일 생성한다. | python manage.py makemigrations [app_name] |
migrate | 생성된 마이그레이션을 적용한다. | python manage.py migrate [app_name] |
sqlmigrate | 특정 마이그레이션에 대한 SQL문을 표시한다. | python manage.py sqlmigrate [migrtaion_file] |
showmigrations | 프로젝트의 모든 마이그레이션을 보여준다. | python manage.py showmigrations [app_name] |
python manage.py makemigrations [app_name]
마이그레이션을 생성하는 명령어다.
자신이 이전에 생성한 app_name의 model.py와 관련된 마이그레이션을 생성하는 명령어다.
# app_name/models.py
from django.db import models
class Course(models.Model):
major = models.CharField(max_length=50)
year = models.IntegerField()
classification = models.CharField(max_length=20)
course_code = models.CharField(max_length=20)
course_name = models.CharField(max_length=100)
professor = models.CharField(max_length=50)
timetable_period = models.CharField(max_length=100)
timetable_time = models.CharField(max_length=100)
credits = models.IntegerField()
class_type = models.CharField(max_length=20)
def __str__(self):
return self.course_name
app_name 내부에 있는 models.py를 작성하고 명령어를 실행하면 다음가 같이 실행된다. 여기서 app_name은 timetable이다.
그렇다면, app_name/migrations/0001_initial.py가 생성된 것을 확인할 수 있다.
혹시 여기서 No installed app with label 'app_name'이 출력된다면, setting.py 에서 installed app이 잘 안되어있으니 다시확인해보자.
python manage.py migrate [app_name]
생성된 마이그레이션 파일을 적용하는 명령어다.
생성된 마이그레이션 파일(0001_initial.py)을 실제 DB에 적용한다. 여기서 이전 버전으로 되돌리는 것으로 가능하다.(0001이 적용되기 이전의 상태 등)
python manage.py sqlmigrate [migrtaion_file]
특정 마이그레이션에 대한 SQL문을 표시한다. 마이그레이션 파일이 SQL문으로 어떻게 적용되는지를 보여준다.
마이그레이션 파일이 SQL문으로 적용된 것을 확인할 수 있다.
python manage.py showmigrations [app_name]
마이그레이션이 적용된 상태를 표시해준다.
현재 0001만 적용되어있는 것을 확인할 수 있다.
주의점
마이그레이션은 서로 종속성(dependency)를 가지고 있을 확률이 매우 높기 때문에 함부로 삭제하지 말고 잘 확인하는 것이 필요하다. (다들 git 사용할 때, 함부로 이전 commit 날리지 않듯이...) 이와 관련해서 꽤나 고생해서 기억이 납니다...
출처 : https://docs.djangoproject.com/en/5.0/topics/migrations/