[Django] Migration 사용

2018. 8. 23. 14:55
반응형

[Django] Migration 사용




▼ 명령어

1
2
3
4
5
6
7
8
9
10
11
# 마이그레이션 파일 생성
$ python manage.py makemigrations <app-name>
 
# 마이그레이션 적용
$ python manage.py migrate <app-name>
 
# 마이그레이션 적용 현황
$ python manage.py showmigrations <app-name>
 
# 지정 마이그레이션의 SQL 내역
 python manage.py sqlmigrate <app-name> <migration-name>
cs

마이그레이션 생성법 및 반영

  1. 마이그레이션 파일 (초안) 생성하기 : makemigrations 
  2. 해당 마이그레이션 파일을 DB에 반영하기 : migrate 
views
<마이그레이션 절차 및 주의사항>

 TIP

  1. makemigrations 이후에는 migration 폴더를 확인하는 습관을 갖는게 좋다. DB는 중요하기 때문에 무엇이 수정되었는지 다시 한번 확인하는 습관
  2. makemigrations [app-name] 처럼 app 이름을 명시하는 것이 좋다. (예상치 못한 migration을 방지)
  3. showmigrations 를 통해서 적용 상태를 조회할 수 있다. [x] : 적용 후 []: 적용 전
  4. 실제 DB에는 sql 쿼리로 명령이 전달이 된다. migration 파일은 쿼리는 아니다. 따라서 sqlmigrate 명령을 통해 sql로도 확인하는 습관이 필요하다.
  5. 이미 적용한 migration 파일은 절대로 지우면 안된다.
  6. 프로젝트/앱 생성 후 처음 migrate 할 때는 app 이름을 명시하지 않는다. 이는 장고 기본 앱에, 여러 앱에 걸쳐서 적용할 migrate가 있기 때문이다.
  7. no such table, column 등의 오류는 migration 관련 문제이다.


▼ 마이그레이션 migrate 롤백 

일반적인 migrate

1
$ python manage.py migrate <app-name>
cs
  • 미적용 마이그레이션 파일 부터 최근 마이그레이션 파일까지 Forward 마이그레이션을 순차적으로 수행한다.

특정 파일지정을 통한 migrate

1
$ python manage.py migrate <app-name> <마이그레이션 파일명>
cs
  • 지정한 마이그레이션 파일이 현재 적용된 마이그레이션 파일 보다
    • 이후라면,  Forward 마이그레이션 을 순차적으로 진행
    • 이전이라면,  Backward 마이그레이션 을 순차적으로 진행 (롤백)

▼ 마이그레이션 파일지정

  • 전체 파일명을 지정하지 않더라도, 판독이 가능하다면 파일명 일부로도 지정이 가능하다.
  • 롤백 후에 돌아오면 테이블의 데이터레코드가 사라짐. 장고 모델의 migration은 스키마의 형상관리로, 데이터 백업을 지원하지 않는다.
    따라서  주기적인 백업
    이 필요하다.



    1
    2
    3
    4
    5
    6
    7
    # 파일명 예시
    blog/migrations/0001_initial.py
    blog/migrations/0002_create_field.py
    blog/migrations/0002_update_field.py
     
    python manage.py migrate blog 0001 # OK
    python manage.py migrate blog 0002 # FAIL (다수 파일 해당)
    cs


▼ ID 필드

  • 모든 데이터베이스 테이블에는 각 Row의 식별 기준인 기본키(Primary Key) 가 필요
  • Django에는 기본키로 id(AutoField)가 디폴트로 지정되어 있음 (AutoField : 1부터 시작해서 값이 1씩 증가하는 것)
  • 기본키는 줄여서 pk로도 접근 가능 (primary key)

▼ 기존 모델 클래스에 필수 필드 추가

  • 필드옵션 blank, null의 디폴트 값은 False이다. 따라서 기본적으로 모든 필드는 필수 필드이다.
  • 만약 새로운 필수 필드를 추가해서 makemigrations를 수행하면, 기존에 있는 레코드에 대해서 어떤 값을 채워 넣을지 설정해야한다.
    • 선택 1 : 지금 값을 입력
    • 선택 2 : 모델 클래스를 수정하여 디폴트 값을 제공





**참고 https://wayhome25.github.io/blog/categories/#python

반응형

BELATED ARTICLES

more