'2018/05'에 해당되는 글 1건

  1. 2018.05.01 model migrate 하기

model migrate 하기

|


모델 생성

python manage.py makemigrations <appname>

-> create,update,delete등의 변경사항을 migration으로 저장 및 django에 알림

-> 디스크상의 파일로 존재 appname/migrations/0001_initial.py


위의 쿼리를 보고 싶다면?

python manage.py sqlmigrate <appname> 0001

-> 위 숫자는 해당 디렉토리가서 확인하기


실행하기

python manage.py migrate <appname> <위의 숫자>

-> appname, 숫자등은 생략 가능



위의 과정중 오류가 나면 ?

python manage.py migrate --fake <appname>


절대 DB에 들어가 쿼리조작하지말것, 해당앱 migrations 디렉토리가서 파일 삭제하지말것

위 --fake옵션으로 거의 해결가능함






참고자료 : https://docs.djangoproject.com/ko/2.0/intro/tutorial02/



테이블 꼬였을경우 다시 처음부터.... ?





05) 마이그레이션 파일 제거

마이그레이션 파일 제거

Django 마이그레이션 도구는 모델 관리에 훌륭한 도구이다 그러나 너무 많이 저장소에서 관리하는 것이 때로는 불필요한 문제나 부작용을 일으키기도 한다. 그래서 가끔은 마이그레이션 파일을 정리하는 것이 좋다.

첫 번째 시나리오

아직 전혀 배포되지 않은 개발 중인 프로젝트는 중간 중간에 마이그레이션을 싹 지우는 것도 좋다.

마이그레이션 디렉토리 안에 모든 파일을 __init__.py 모듈 빼고 싹 지운다. 리눅스에서는 아래와 같은 명령어로 쉽게 지울 수 있다.

find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc"  -delete

데이터베이스를 제거한다. 기본 SQLite 엔진으로 개발 중이라면 db.sqlite3 파일을 삭제한다.

초기 마이그레이션 파일을 생성하고 데이터베이스 스키마를 생성한다.

python manage.py makemigrations
python manage.py migrate

두 번째 시나리오

마이그레이션 파일은 모두 지우지만 데이터베이스 데이터는 유지하고 싶은 경우이다.

현재 반영 안 된 마이그레이션이 없는지 확인한다.

python manage.py makemigrations

위와 같이 명령하여 아래 메시지를 확인하면 추가로 반영할 마이그레이션이 없는 경우다.

No changes detected

그러나 추가로 마이그레이션 파일이 만들어지면 이를 아래와 같이 명령하여 반영하도록 한다.

python manage.py migrate

프로젝트 앱 마이그레이션 히스토리 삭제

python manage.py showmigrations

위와 같이 명령하면 프로젝트 안에 앱들의 마이그레이션 히스토리를 볼 수 있다.

admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
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
blog
 [X] 0001_initial
 [X] 0002_auto_20170610_1904
 [X] 0003_auto_20170610_1906
 [X] 0004_auto_20170610_2044
 [X] 0005_auto_20170613_1152
 [X] 0006_post_description
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial

위 예제에서는 blog 앱의 마이그레이션 파일을아래와 같이 명령하여 초기화한다.

python manage.py migrate --fake blog zero

위 명령어의 결과는 아래와 같다.

Operations to perform:
  Unapply all migrations: blog
Running migrations:
  Rendering model states... DONE
  Unapplying blog.0006_post_description... FAKED
  Unapplying blog.0005_auto_20170613_1152... FAKED
  Unapplying blog.0004_auto_20170610_2044... FAKED
  Unapplying blog.0003_auto_20170610_1906... FAKED
  Unapplying blog.0002_auto_20170610_1904... FAKED
  Unapplying blog.0001_initial... FAKED

다시 아래와 같이 마이그레이션 히스토리를 확인하기 위해 명령할 수 있다.

python manage.py showmigrations

아래 결과에서 blog의 경우에는 마이그레이션 히스토리 앞에 [X] 표시가 사라진 것을 확인할 수 있다.

admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
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
blog
 [ ] 0001_initial
 [ ] 0002_auto_20170610_1904
 [ ] 0003_auto_20170610_1906
 [ ] 0004_auto_20170610_2044
 [ ] 0005_auto_20170613_1152
 [ ] 0006_post_description
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial

마이그레이션 파일 삭제

blog 앱의 마이그레이션 디렉토리 안에 __init__.py 파일을 빼고 모두 삭제한다. 그리고 다시 아래와 같이 마이그레이션 히스토리를 확인해본다.

python manage.py showmigrations

그러면 아래와 같이 blog 앱에는 마이그레이션이 없다는 결과를 확인할 수 있다.

admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
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
blog
 (no migrations)
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial

초기 마이그레이션 파일 생성

이제 초기 마이그레이션 파일을 만들기 위해 아래와 같이 명령한다.

python manage.py makemigrations

최초 마이그레이션 파일 0001_initial.py이 생성된 것을 확인할 수 있다.

Migrations for 'blog':
  blog\migrations\0001_initial.py
    - Create model Post

페이크 마이그레이션

데이터베이스 테이블이 이미 존재하기 때문에 초기 마이그레이션 파일을 적용할 수 없다. 따라서 마치 마이그레이션을 한 것처럼 아래와 같이 명령하여 페이크 마이그레이션한다.

python manage.py migrate --fake-initial

결과는 다음과 같다.

Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  Applying blog.0001_initial... FAKED

그리고 최종 마이그레이션 히스토리를 보면 아래와 같이 blog 앱에는 0001_initial 마이그레이션만 반영된 것으로 확인할 수 있다.

python manage.py showmigrations
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
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
blog
 [X] 0001_initial
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial

요약하면 아래와 같은 순서로 명령한다.

  1. python manage.py makemigrations
  2. python manage.py showmigrations
  3. python manage.py migrate --fake 프로젝트_앱 zero
  4. 마이그레이션 파일 삭제
  5. python manage.py makemigrations
  6. python manage.py migrate --fake-initial




출처 : https://wikidocs.net/9926


And
prev | 1 | next