Django 마이그레이션 생성 및 적용하기

Kangjik Kim·2025년 1월 8일
0

Blog 데이터 모델이 있으므로 해당 데이터베이스 테이블을 만들어야 한다.

쟝고는 모델의 변경 사항을 추적하고 데이터베이스에 적용할 수 있는 마이그레이션 시스템이 있다.

migrate 명령은 INSTALLED_APPS에 열거된 모든 앱과 마이그레이션을 적용하고,
데이터베이스를 현재 모델 및 기존 마이그레이션과 동기화한다.

먼저 Post 모델의 초기 마이그레이션을 생성해보자.

python manage.py makemigrations blog

아래와 같은 실행 결과가 나타날 것이다.

Migrations for 'blog':
  blog/migrations/0001_initial.py
    - Create model Post
    - Create index blog_post_publish_bb7600_idx on field(s) -publish of model post

blog 애플리케이션의 migrations 디렉토리에 0001_initial.py 파일이 생성됐다.

이 마이그레이션에는 Post 모델의 테이블을 생성하는 SQL 문과, publish 필드에 대한 데이터베이스 인덱스의 정의가 들어있다.

마이그레이션은 변경된 모델과 동기화하기 위해 데이터베이스에서 수행할 다른 마이그레이션 및 작업에 대한 종속성을 명시한다.

쟝고가 테이블을 생성하기 위해 데이터베이스에서 실행할 SQL 코드를 살펴보자.

sqlmigrate 명령은 마이그레이션 이름을 가져와 실행하지 않고 SQL을 반환한다.

python manage.py sqlmigrate blog 0001

아래와 같은 실행 결과가 나타날 것이다.

BEGIN;
--
-- Create model Post
--
CREATE TABLE "blog_post" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(250) NOT NULL, "slug" varchar(250) NOT NULL, "body" text NOT NULL, "publish" datetime NOT NULL, "created" datetime NOT NULL, "updated" datetime NOT NULL, "status" varchar(2) NOT NULL, "author_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED);
--
-- Create index blog_post_publish_bb7600_idx on field(s) -publish of model post
--
CREATE INDEX "blog_post_publish_bb7600_idx" ON "blog_post" ("publish" DESC);
CREATE INDEX "blog_post_slug_b95473f2" ON "blog_post" ("slug");
CREATE INDEX "blog_post_author_id_dd7a8485" ON "blog_post" ("author_id");
COMMIT;

정확한 출력은 사용 중인 DB에 따라 다르지만, 위 출력은 SQLite를 사용한 경우의 출력이다.

출력에서 볼 수 있듯이 쟝고는 애플리케이션 소문자로 이름과 모델을 조합해 테이블 이름(blog_post)를 만들지만 모델의 Meta 클래스에서 db_table 속성을 사용해 DB 이름을 사용자가 지정할 수 있다.

또한 쟝고는 각 모델의 기본 키로 사용되는 자동 증가 id 컬럼을 생성하지만 모델 필드 중 하나에 primary_key=True를 지정해 이를 재정의할 수 있다.

모델에 자동으로 추가되는 기본 id 컬럼은 자동으로 증가하는 정수로 구성된다.

위 마이그레이션으로 세 가지의 인덱스가 생성된다.

  • publish 내림차순
    • 모델의 Meta 클래스의 indexes 옵션을 사용해 명시적으로 정의한 인덱스이다.
  • slug
    • SlugField는 기본적으로 인덱스를 가진다.
  • author_id
    • ForeignKey 필드는 기본적으로 인덱스를 가진다.

이제 DB를 새로운 모델과 동기화 해보자.

python manage.py migrate

아래와 같은 실행 결과가 출력될 것이다.

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

이렇게 blog 앱을 포함해서 INSTALLED_APPS에 나열된 앱에 마이그레이션을 적용했다.

마이그레이션을 적용하고 나면 데이터베이스는 모델의 현재 상태를 반영한다.

기존 모델의 필드를 추가, 삭제 또는 변경하기 위해 models.py 파일을 편집하거나 새 모델을 추가하는 경우 makemigrations 명령을 사용해 새 마이그레이션을 생성해야 한다.

각 마이그레이션을 통해 쟝고는 모델 변경 사항을 추적할 수 있다.

그런 다음 데이터베이스를 모델과 동기화된 상태로 유지하려면 migrate 명령을 사용해서 마이그레이션을 적용해야 한다.

0개의 댓글