(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