Django | Migrations가 어떻게 만들어질까
장고에 설치되어 있는 앱
INSTALLED_APPS=[
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"django.contrib.sites",
]
위 앱들이 장고에 기본적으로 설치되어 있으며, migrate을 하면 아래와 같이 해당 테이블들이 생성 된다.
auth_group,
auth_group_permissions,
auth_permission,
auth_user,
auth_user_groups,
auth_user_user_permissions,
django_admin_log,
django_content_type,
django_migrations,
django_session,
django_site
django 기본 테이블
아무 앱도 설치 하지 않고 기본으로 설치되어 있는 앱들에 대한 migrate를 실행했을 때 생성되는 테이블들이다.
auth_permissions
- 모델을 생성할 때마다 장고가 자동으로 permission을 생성한다.
- 이는 장고가 유저에게 어떤 데이터에 접근할 수 있는 지에 관한 권한을 생성해 주는 것이다.
- add, change, delete, view에 관한 권한이 생성 된다.
django_admin_log
- django admin이 어떤 행동을 했는 지에 대한 기록이 담겨 있다.
django_migrations
- 모든 migration 정보들이 담겨 있다.
- Version Constrol System(VCS) 처럼 동작한다.
- 따라서, migarion을 롤백하는 것도 가능하다.
django_session
- django admin을 이용하면 session을 사용하게 된다.
- session을 사용하지 않는다면 관련된 것들을 전부 지워도 된다.
- INSTALLED_APPS의
django.contrib.sessions
, MIDDLEWARE의django.contrib.sessions.middleware.SessionMiddleware
가 이에 해당한다.
Migrate 명령어
Make migrations
python manage.py makemigrations
- 일단, python을 실행하면 인터프리터가 byte code로 compile을 한다.
- 이는
__pychace__
디렉토리에 저장 되는 캐시 파일이며 특정 태스크의 속도를 높여 준다. - 하지만, 속도를 높이기 위해서 필요한 것이기 때문에 꼭 필요하지는 않다. 그렇기 때문에 보통은 gitignore를 한다.
- 이는
- makemigrations 명령어를 실행하면 데이터베이스로 데이터를 넣을 “준비"를 하는 것이다.
- 즉, add fields OR delete fields ... 등의 준비를 하게 된다.
id
(PK)는 장고가 자동으로 생성해 준다.migrate
명령어를 실행하면 migrations 파일들이 SQL 코드로 번역 된다.- 그러면 해당 SQL 코드들이 데이터베이스에 의해 실행되며 테이블을 생성한다.
- 만약 만들어진 migrations 파일 내용에 대한 sql을 보고 싶다면 아래 명령어를 실행하면 된다.
python manage.py sqlmigrate <앱명> <마이그레이션 번호>
- 마이그레이션 번호는
0001_initial.py
면 0001이 되며0002_auto_20220103.py
면 0002가 된다. - 이 명령어를 trouble-shooting에 쓸 수 있다.
- sqlmigrate 명령어를 실행해도 실제로 데이터베이스의 마이그레이션을 실행하지 않으니 걱정할 필요는 없다!
- 마이그레이션 번호는
Showmigrations
python manage.py showmigrations
- 실행된 모든 migrations와 commit 되었는 지 여부를 알려 준다.
account [X] 0001_initial [X] 0002_email_max_length admin [X] 0001_initial [X] 0002_logentry_remove_auto_add [X] 0003_logentry_add_action_flag_choices agreements [ ] 0001_initial
- 만약 위와 같이
[ ]
안에 X 표시가 들어가 있지 않다면 아직 commit 되지 않은 것이다.
- 만약 위와 같이
migrate
python manage.py migrate
-
이 명령어를 실행하면 migration 파일에 있는 내용들이 sql 코드로 실행되어 테이블이 생성 된다.
-
또한, migration과 관련 있는 다른 테이블들에 해당 내용들이 기록된다.
- django_migrations 테이블에 migrate 된 migration 파일명이 기입된다.
- django_content_type에 migrate가 실행된 앱 명과 model명이 기입 된다.
-
만약 migration을 rollback 하고 싶다면 어떻게 해야 할까?
-
예를 들어, “blogs” 앱에 두 개의 migration 파일이 있다고 하자.
0001_initial.py
0002_auto_20201008_2208.py
-
0002까지 migrate을 실행했는데 0001로 되돌려야 한다면 아래의 명령어를 실행하면 된다.
-
python manage.py migrate blogs 0001
-
즉,
python manage.py migrate <앱 명> <마이그레이션 번호>
가 필요하다. -
그러면 아래와 같은 결과가 나온다.
- 그러나, 데이터베이스가 복잡해질수록 원하는 결과가 되지 않을 수도 있다.
-
-
여기서 또다시 0001로 돌아가고 싶다면 아래와 같이 하면 된다.
-
python manage.py migrate blogs 0001 --plan
--plan
명령어를 이용하면 어떤 migration으로 돌아갈 지 명시한다.- 위 명령어를 실행하면 0001로 돌아가겠다는 뜻이 된다.
- 그런데 이미 0001로 돌아간 상태이기 때문에 “No planned migration operations”가 뜬 것이다.
-
위 명령어를 실행한 상태에서 0002를 다시 migrate 한다.
python manage.py migrate blogs 0002
- 그러면 이제 0002가 migrate 된다.
-
-
만약 여기서 다시 0001로 돌아가고 싶다면?
-
python manage.py migrate blogs 0001 --plan
을 하면 된다.
-
-
Author And Source
이 문제에 관하여(Django | Migrations가 어떻게 만들어질까), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@combi_jihoon/Django-Migrations에-대하여저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)