Django Docs | Migrations - 1

Jihun Kim·2022년 3월 3일
0

Django Docs

목록 보기
9/9
post-thumbnail

Dependencies

만약 books 앱에 authors 앱에 대한 Forien Key를 추가하면 이에 따른 books의 migration은 authors에 대한 의존성을 갖게 된다.

그렇기 때문에, migrations 명령을 실행할 경우 authors 마이그레이션이 먼저 실행되어야 Foreign key가 참조하는 테이블이 생성되고 그 다음 books의 Foreign Key 열을 만드는 migration이 실행되어 제약 조건이 생성 되는 것이다.

만약 이 순서에 의해 생성되지 않는다면 migration은 테이블 없이 Foreign Key를 생성하려 할 것이며 이 경우 데이터베이스에 에러가 발생하게 된다.

이것이 바로 Migration의 의존성이다.



Migration의 Version control

마이그레이션은 version control에 저장되기 때문에 git 처럼 가끔씩 충돌 상황이 발생할 때가 있다.
예를 들어, 내가 migration을 A 앱에 생성했는데 다른 개발자도 나와 동시에 A 앱에 migration을 생성했다면 두 migration이 동일한 번호를 갖게 되는 경우가 생길 수 있다. 이 때 충돌이 일어나게 되는 것이다.

  • migration에 적혀 있는 번호는 개발자가 참고하도록 만들어진 것으로, 각 마이그레이션 파일은 사실 다른 이름을 가지고 있기만 하면 된다.
    - 따라서, 이러한 충돌 상황이 발생하면 migration 파일명을 변경하면 되며 해당 파일에 dependencies를 가진 migration에 대해서는 변경된 파일명을 적어주면 된다.
  • migration은 각 migration이 서로 어떤 migration에 dependencies를 가지고 있는 지를 표기한다.


Migration 파일 살펴보기

마이그레이션은 여기에서 migrations 디렉토리에 온디스크 형식으로 저장 된다. 이 파일은 일반적인 파이썬 파일이며 그 내용은 declarative(선언적) 스타일로 작성되어 합의된 객체 레이아웃이라 볼 수 있다.

from django.db import migrations, models

class Migration(migrations.Migration):

    dependencies = [('migrations', '0001_initial')]

    operations = [
        migrations.DeleteModel('Tribble'),
        migrations.AddField('Author', 'rating', models.IntegerField(default=0)),
    ]

여기서 중요한 것은, Django가 마이그레이션 파일(Python 모듈로)을 로드할 때 찾는 것은 Migration이라는 django.db.migrations.Migration의 하위 클래스라는 것이다. 그 다음 장고는 이 객체에서 4개의 속성을 검사하는데 일반적으로는 그 중 2개만 사용된다.

  • dependencies
    - 해당 Migration 클래스가 dependencies를 갖고 있는(의존하는) 마이그레이션 리스트
  • operations
    - migration이 무얼 하는 지의 '행위'를 명시한 Operation 클래스로 구성된 리스트
    - 이를 이용해 장고에게 어떤 스키마에 변경 사항이 있는 지를 알릴 수 있다.
    - 장고는 이를 스캔하고 모든 앱에 대한 모든 스키마 변경 사항의 인메모리 표현을 구축하며, 이를 통해 스키마 변경을 수행하는 SQL을 생성한다.
      


참고
장고 docs

profile
쿄쿄

0개의 댓글