아래 내용은 초보몽키님 블로그 Migration 설명에서 인용
migrations
- 모델 변경내역 히스토리 관리
- 모델의 변경내역을 DB Schema (데이터베이스 데이터 구조)로 반영시키는 효율적인 방법을 제공
migration 옵션을 끌수도 있다.
# 마이그레이션 파일 생성 $ 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>
Tip
- makemigrations 이후에는 migration 폴더를 확인하는 습관을 갖는게 좋다. DB는 중요하기 때문에 무엇이 수정되었는지 다시 한번 확인하는 습관.
- makemigrations [app-name] 처럼 app 이름을 명시하는 것이 좋다. (예상치 못한 migration을 방지)
- showmigrations 를 통해서 적용 상태를 조회할 수 있다. [x] : 적용 후 []: 적용 전
- 실제 DB에는 sql 쿼리로 명령이 전달이 된다. migration 파일은 쿼리는 아니다. 따라서
sqlmigrate
명령을 통해 sql로도 확인하는 습관이 필요하다.- 이미 적용한 migration 파일은 절대로 지우면 안된다.
- 프로젝트/앱 생성 후 처음 migrate 할 때는 app 이름을 명시하지 않는다. 이는 장고 기본 앱에, 여러 앱에 걸쳐서 적용할 migrate가 있기 때문이다.
- no such table, column 등의 오류는 migration 관련 문제이다.
특정 파일지정을 통한 migrate
$ python manage.py migrate <app-name> <마이그레이션 파일명>
지정한 마이그레이션 파일이 현재 적용된 마이그레이션 파일 보다
- 이후라면,
Forward 마이그레이션
을 순차적으로 진행- 이전이라면,
Backward 마이그레이션
을 순차적으로 진행 (롤백
)마이그레이션 파일명 지정
- 전체 파일명을 지정하지 않더라도, 판독이 가능하다면 파일명 일부로도 지정이 가능하다.
- 롤백 후에 돌아오면
테이블의 데이터 레코드가 사라진다
. 장고 모델의 migration은 스키마의 형상관리로, 데이터 백업을 지원하지 않는다. 따라서주기적인 백업
이 필요하다.# 파일명 예시 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 (다수 파일 해당)
Django 는 DB에 관한 내용을 models.py로 추상화하여 관리한다. 그래서 사용자는 SQL 문을 신경쓰지 않고, Django ORM을 사용하여 DB 자료를 손쉽게 관리 할 수있다. 따라서 DB에 변화가 생기는 경우, Django에서 해당 내용을 인지하도록 sync를 맞춰줘야만 한다. (models.py 를 수정하고, makemigration, migrate를 해야한다.)
이에 관련해서 빈번하게 생기는 오류는 2가지를 들 수 있다.
Case | DB | Django |
---|---|---|
1 | Change | No change |
2 | Change on 1,2,3 table | Change on 4,5,6 tabel |
1. DB를 선 변경
DB에서 칼럼을 하나 추가하고 Django migration을 내버려 두었다. Django 에러 뜨는거 보고 models.py
를 수정 하고 migrate까지 했는데 여기서 에러가 난다. 이미 있는 칼럼이라서 추가할수 없다.
이럴 때는 makemigration을 한뒤에 migrate를 했다고 장고가 인식하게 하면 된다.
$python manage.py showmigration
#생성된 migration 이름 확인
$python manage.py --fake migrate <app_name> <migrate_name>
를 입력하면 makemigration를 통해 생성된 migration을 DB 에 적용 한걸로 Django에서 인식한다.
2. DB와 Django가 서로 다른 변경내역이 있을 경우
1. 디펜던시가 복잡하지 않다면, DB 내역을 위의 방법으로 Django에 반영하고, Django 변경내역은 migration 과정을 통해 일치 시키면 된다.
-
디펜던시가 복잡하고 처리가 어렵다면, DB 초기화후 재 생성 하는 방법도 있다. (데이터가 중요하지 않은 경우, 데이터 베이스를 그대로 사용하고 싶으면, DB schema에 models.py를 맞추면 된다. )