장고 튜토리얼) makemigrations와 migrate 알아보기(migration과 database)

작성자: [관리자] 하얀설표

2025.06.15 15:55 (KST) 작성됨

2025.06.15 16:18 (KST) 수정됨






(06.15) 수정됨.

콘솔 실행하기

예제를 따라하기 위해서는 cmd 콘솔을 실행해야 한다.

콘솔 실행 방법을 모른다면 패키지 설치와 프로젝트 설치 및 실행 방법을 보고 오자.

 

장고와 마이그레이션

장고 프로젝트를 만들 때 가장 중요한 것은 마이그레이션이다.

마이그레이션된 데이터를 기준으로 db(데이터베이스) 테이블을 생성하고 변경하기 때문이다.

 

장고 데이터베이스 생성방법

장고의 데이터베이스는 migrate를 실행했을 때 생성되고, 변경된다.

데이터베이스의 기본 이름은 "db.sqlite3"이며, settings.py를 통해 이름과 파일 위치를 변경하는 것이 가능하다.

 

데이터베이스가 생성된다면 트리 구조는 다음과 같다.

...
|- db.sqlite3
|- mange.py
|- config
    |- ...

 

생성된 마이그레이션 확인하는 방법

"python manage.py showmigrations" 명령으로 현재 생성된 마이그레이션과 적용 중인 마이그레이션을 확인할 수 있다.

 

아직 별도의 app을 만든게 없기 때문에 djagno의 기본 app들의 마이그레이션만 존재한다.

(django-sample) C:\WhiteSeolpyo\django-sample\django_sample>python manage.py showmigrations
admin
 [ ] 0001_initial
 [ ] 0002_logentry_remove_auto_add
 [ ] 0003_logentry_add_action_flag_choices
auth
 [ ] 0001_initial
 [ ] 0002_alter_permission_name_max_length
 [ ] 0003_alter_user_email_max_length
 [ ] 0004_alter_user_username_opts
 [ ] 0005_alter_user_last_login_null
 [ ] 0006_require_contenttypes_0002
 [ ] 0007_alter_validators_add_error_messages
 [ ] 0008_alter_user_username_max_length
 [ ] 0009_alter_user_last_name_max_length
 [ ] 0010_alter_group_name_max_length
 [ ] 0011_update_proxy_permissions
 [ ] 0012_alter_user_first_name_max_length
contenttypes
 [ ] 0001_initial
 [ ] 0002_remove_content_type_name
sessions
 [ ] 0001_initial

 

적용 중인 마이그레이션 구분하는 방법

마이그레이션 목록을 보면 app name 아래 "[ ] 0001_initail"과 같은 식으로 표현되어있다.

대괄호("["와 "]") 사이가 공란이면 적용되지 않은 마이그레이션이고, "[X] 0001_initail"와 같이 표시되어있으면 적용 중인 마이그레이션이라는 뜻이다.

 

마이그레이션 생성하는 방법

"python manage.py makemigrations" 명령을 통해 아직 생성되지 않은 마이그레이션을 생성할 수 있다.

마지막 마이그레이션과 현재 app의 model이 다를 경우에만 마이그레이션이 생성된다.

"python manage.py makemigrations {app name}"을 입력하면 특정 app의 마이그레이션만 생성할 수 있다.

 

현재 변경된 model이 없기 때문에 makemigrations를 진행하더라도 새롭게 생성되는 마이그레이션은 없다.

(django-sample) C:\WhiteSeolpyo\django-sample\django_sample>python manage.py makemigrations
No changes detected

 

마이그레이션 적용하는 방법

"python manage.py migrate" 명령을 통해 마이그레이션을 적용할 수 있다.

"python manage.py migrate {app name}"과 같은 식으로 명령을 하면 특정 app의 마이그레이션만 적용한다.

 

admin app의 마이그레이션만 적용하면 다음과 같이 진행된다.

contenttypes는 별개의 app이지만, 각 app을 기록하는 app이기 때문에 어떤 app을 마이그레이트하더라도 contenttypes의 initial 마이그레이션이 함께 적용된다.

(django-sample) C:\WhiteSeolpyo\django-sample\django_sample>python manage.py migrate admin
Operations to perform:
  Apply all migrations: admin
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK

(django-sample) C:\WhiteSeolpyo\django-sample\django_sample>python manage.py showmigrations
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
 [X] 0003_logentry_add_action_flag_choices
auth
 [X] 0001_initial
 [ ] 0002_alter_permission_name_max_length
 [ ] 0003_alter_user_email_max_length
 [ ] 0004_alter_user_username_opts
 [ ] 0005_alter_user_last_login_null
 [ ] 0006_require_contenttypes_0002
 [ ] 0007_alter_validators_add_error_messages
 [ ] 0008_alter_user_username_max_length
 [ ] 0009_alter_user_last_name_max_length
 [ ] 0010_alter_group_name_max_length
 [ ] 0011_update_proxy_permissions
 [ ] 0012_alter_user_first_name_max_length
contenttypes
 [X] 0001_initial
 [ ] 0002_remove_content_type_name
sessions
 [ ] 0001_initial

 

전체 마이그레이션 적용하기

app name 없이 migrate를 하면 아직 적용되지 않은 모든 마이그레이션이 적용된다.

(django-sample) C:\WhiteSeolpyo\django-sample\django_sample>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

(django-sample) C:\WhiteSeolpyo\django-sample\django_sample>python manage.py showmigrations
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
 [X] 0003_logentry_add_action_flag_choices
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
 [X] 0009_alter_user_last_name_max_length
 [X] 0010_alter_group_name_max_length
 [X] 0011_update_proxy_permissions
 [X] 0012_alter_user_first_name_max_length
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial

 

마이그레이션 롤백하는 방법

"python manage.py migrate {app name} {migraino version}"을 입력하는 특정 버전의 마이그레이션을 적용할 수 있다.

만약 현재 적용된 것보다 과거의 마이그레이션이라면 다음과 같이 해당 버전 이후의 마이그레이션은 적용이 해제된다.

(django-sample) C:\WhiteSeolpyo\django-sample\django_sample>python manage.py migrate admin 0002
Operations to perform:
  Target specific migration: 0002_logentry_remove_auto_add, from admin
Running migrations:
  Rendering model states... DONE
  Unapplying admin.0003_logentry_add_action_flag_choices... OK

(django-sample) C:\WhiteSeolpyo\django-sample\django_sample>python manage.py showmigrations
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
 [ ] 0003_logentry_add_action_flag_choices
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
 [X] 0009_alter_user_last_name_max_length
 [X] 0010_alter_group_name_max_length
 [X] 0011_update_proxy_permissions
 [X] 0012_alter_user_first_name_max_length
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial

 

 






추천 (0)


글 목록

댓글을 달 수 없는 게시물입니다.


"분류없음" 카테고리의 #Django, #Django 튜토리얼 관련 게시물

분류없음
해결) 장고 bulk_update의 메모리 누수 문제(django orm bluk_update method memory leak)
수정 07.12 | [관리자] 하얀설표
👍 0
#Python, #Django
🗨️ 0
분류없음
거지같은 subQuery와 outerRef
수정 06.29 | [관리자] 하얀설표
👍 0
#Django
🗨️ 0
분류없음
장고) pk 리스트에 등록된 순서대로 오브젝트를 가져오기 예제
작성 06.29 | [관리자] 하얀설표
👍 0
#Django
🗨️ 0
분류없음
해결) django.db.utils.OperationalError: database is locked
수정 06.18 | [관리자] 하얀설표
👍 0
#Python, #에러해결, #Django
🗨️ 0
썸네일
분류없음
장고 예제) 게시판 기능 만들기
수정 06.17 | [관리자] 하얀설표
👍 0
#Django, #Django 예제
🗨️ 0
썸네일
분류없음
장고 튜토리얼) 템플릿 작성과 로그인 구현 예제
수정 06.17 | [관리자] 하얀설표
👍 0
#Django 튜토리얼, #Django 예제
🗨️ 0
분류없음
장고 튜토리얼) settings.py 분리하기
수정 06.15 | [관리자] 하얀설표
👍 0
#Django, #Django 튜토리얼
🗨️ 0
썸네일
분류없음
장고 튜토리얼) 패키지 설치와 프로젝트 설치 및 실행 방법
수정 06.15 | [관리자] 하얀설표
👍 0
#Django, #Django 튜토리얼
🗨️ 0
분류없음
장고 튜토리얼) 관리자 계정과 일반 계정 만드는 방법
수정 06.15 | [관리자] 하얀설표
👍 0
#Django, #Django 튜토리얼
🗨️ 0
분류없음
장고) 게시판 템플릿 쉽게 만드는 방법
수정 06.15 | [관리자] 하얀설표
👍 0
#Django
🗨️ 0