728x90

마이그레이션(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/