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 을 하면 된다.

좋은 웹페이지 즐겨찾기