이번 글에서는 django의 마이그레이션과 squashmigrations 명령어에 대해서 작성해 보았습니다.
1. migration이란
Django는 개발자가 모델링을 하면, 개발자가 작성한 models.py과 실제 db와 같은 상태를 유지하기 위해 django orm은 plan을 작성하며 관리합니다.
이런 plan을 생성하기 위해 makemigrations 명령어를 사용합니다. 이렇게 해서 새로 생성된 plan은 myapp/migrations 안에 xxxx_변경내용.py로 저장되게 되며 이런 파일을 마이그레이션 파일이라고 합니다.
마이그레이션 파일은 현재 migrations에 저장되어 있는 파일들을 기반으로 models.py 파일의 변경사항들이 작성됩니다.
코드로 예시를 들어보면,
class Food(models.Model):
name = models.CharField(max_length=20)
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Food',
fields=[
('name', models.CharField(max_length=20))
],
),
]
CREATE TABLE "food" (
"name" VARCHAR(20) NOT NULL
)
이렇게 생성한 모델을 기반으로 migrations 파일을 새롭게 생성합니다. 그리고 manage.py migrate 명령어를 통해서 마이그레이션 파일을 기반으로 작성된 DDL문이 실제 db에 날아가게 됩니다.
migration파일에서는 operations을 통해서 model의 변경사항을 나타냅니다.
해당 파일은 새로운 모델을 생성해서 CreateModel이 사용되었습니다. 이런 명령어의 종류에는 DeleteModel, RenameModel, RemoveField 등등이 있습니다.
2. squashmigrations
모델을 자주 변경하거나 프로젝트가 오래되게 되면 마이그레이션 파일이 많이 쌓일 수 있습니다.
마이그레이션 파일이 많아지게 되면 여러 단점이 생기게 됩니다. 많은 마이그레이션 파일들은 테이블의 변경 사항들을 관리하기 어렵게 만들고, 1년 전에 새로운 필드를 추가한 상황처럼 이젠 필요가 없는 매우 오래된 변경사항들도 마이그레이션 파일에 저장되어 있게 됩니다. 이럴 땐 squashmigrations 명령어를 사용하면 됩니다. squashmigrations은 여러 개의 마이그레이션 파일을 하나로 합치는 데 사용하는 명령어입니다.
manage.py squashmigrations <appname> <start num> <end num>
명령어의 첫 번째 인자로 앱 이름을 넣고, 마이그레이션을 합칠 번호를 넣어줍니다.
(djangoproject-py3.13) jueun@Jueun djangoProject % python manage.py squashmigrations board 0001 0002
Will squash the following migrations:
- 0001_initial
- 0002_newmodel_content
Do you wish to proceed? [y/N] y
Optimizing...
Optimized from 2 operations to 1 operations.
Created new squashed migration /Users/jueun/PycharmProjects/djangoProject/board/migrations/0001_initial_squashed_0002_newmodel_content.py
You should commit this migration but leave the old ones in place;
the new migration will be used for new installs. Once you are sure
all instances of the codebase have applied the migrations you squashed,
you can delete them.
(djangoproject-py3.13) jueun@Jueun djangoProject %
squashmigrations을 사용한 직후에는 squashed 마이그레이션 파일이 하나 더 생성됩니다. 물론 이 상태로 사용할 순 있지만 마이그레이션 파일을 줄이기 위해선 몇몇 과정이 필요합니다.
1. 먼저 squashed 마이그레이션 파일이 대체한 마이그레이션 파일들을 삭제합니다.
2. 삭제한 마이그레이션 파일을 의존하고 있는 다른 파일들의 dependencies들을 새롭게 생성된 마이그레이션 파일로 변경합니다.
3. squashed 마이그레이션 파일에 replace 속성을 삭제합니다.
이런 과정으로 여러개의 마이그레이션 파일들을 한 개의 파일로 줄일 수 있습니다.
3. 장단점
squashemigrations은 마이그레이션을 간단하게 마이그레이션 파일들을 관리하는 방법일 수 있습니다.
하지만 실제로 마이그레이션 파일을 줄이는 방식은 권장되지 않습니다. 1~2개의 마이그레이션 파일을 합치는 것이 다른 app들의 마이그레이션까지 영향을 미칠 수 있기 때문에 주의가 필요합니다. 만약 마이그레이션 파일을 삭제하게 되면 다시 롤백하는 것도 불가능하기 때문에 프로덕션 환경에서는 신중하게 사용해야 하는 명령어입니다.
'django' 카테고리의 다른 글
Django - Throttling (0) | 2025.01.18 |
---|---|
Django - Inverted Index로 검색하기 (0) | 2024.12.29 |
Django - Trailing Slash (1) | 2024.12.02 |
Django - DB Connection (0) | 2024.10.27 |
Django core - WSGI (1) | 2024.10.21 |