django

장고 마이그레이션이란? 해야하는 이유

monsangter 2023. 4. 6. 05:13

마이그레이션이란?

 

장고 공식문서에서 모델의 변경 내역을 DB 스키마에 적용시키는 장고의 방법이라고 설명되어 있다.

DB스키마를 깃처럼 버전으로 나눠 관리 해줄 수 있게 해주는 시스템.

장고가 기본적으로 제공하는 ORM서비스를 통해 진행된다.

 

마이그레이션 파일은 해당 마이그레이션이 생성된 시점의 모델 구조. (DB 스키마)를 담고 있다.

 

1. 세팅즈 파일안의 installed_apps리스트에 해당 장고 앱이 추가 돼 있어야 한다.

2.makemigrations명령어로 모델 클래스로부터 테이블 스키마를 생성한다.

3.migrate명령어로 만들어진 migrations를 디비에 적용한다.

 

migration에 의해 생성되는 테이블은 app명, 모델 클래스명의 형식으로 생성된다.

 

DB의 설정

장고에서 db에 대한 정보는 settings.py파일에 설정되어 있다. 데이타베이스는 디폴트로 sqlite3로 지정되어 있다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

장고 프레임워크는

  • django.db.backends.postgresql
  • django.db.backends.mysql
  • django.db.backends.sqlite3
  • django.db.backends.oracle 와 같은 db엔진을 지원하고 엔진값을 지정해 사용할 수 있다.

DB설정은 각 엔진마다 서로 다른 옵션을 지정한다.

 

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'MyDB',
        'USER': 'user1',
        'PASSWORD': 'pwd',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

 

스키마란?

 

DB내에서 데이터가 저장되는 구조와 제약 조건을 정의한 것. 장고로 치면 하나의 어플리케이션의 models.py파일이라고 할 수 있다.

 

make migrations

마이그레이션을 생성한다.

뒤에 앱네임을 붙이면 의도하지 않은 미그레이션 생성을 막을 수 있다.

 

migrate
마이그레이션을 적용한다. 실제 DB에 변경사항을 적용하는 명령어이다.

뒤에 앱네임을 붙여 특정 앱만 미그레이트 하거나, 앱네임 뒤에 미그레이션 파일의 이름을 지정해 버전관리를 할 수 있다.

데이터 베이스에 직접 접근하지 않고도 모델의 반복적 변경을 가능하게 해준다.

 

show migrations

app_name을 지정하면 해당 앱에 대해서만, 생략시 전체 앱에 대해 보여주게 된다.

프로젝트의 미그레이션 적용여부를 보여준다.

$ python manage.py showmigrations

auth
 [ ] 0001_initial
 [ ] 0002_alter_permission_name_max_length
 [ ] 0003_alter_user_email_max_length
 [ ] 0004_alter_user_username_opts
 [ ] 0005_alter_user_last_login_null
 [ ] 0006_require_contenttypes_0002
 [ ] 0007_alter_validators_add_error_messages
 [ ] 0008_alter_user_username_max_length
contenttypes
 [ ] 0001_initial
 [ ] 0002_remove_content_type_name
sessions
 [ ] 0001_initial

 

 

sqlmigrate 

 

미그레이트와 동일하게 앱네임과 미그레이션 네임을 붙여줄 수 있다.

미그레이션을 실행하지는 않으나 해당 마이그레이션파일이어떤 구문으로 실행되는지 보여준다.

 

$ python manage.py sqlmigrate test 0001

BEGIN;
--
-- Create model Choice
--
CREATE TABLE "test_temp" (
    "id" serial NOT NULL PRIMARY KEY,
    "name" varchar(200) NOT NULL
);
--
-- Create model Question
--
CREATE TABLE "test_temp2" (
    "id" serial NOT NULL PRIMARY KEY,
    "name" varchar(200) NOT NULL
);
--
-- Add field question to choice
--
ALTER TABLE "test_temp" ADD COLUMN "temp2_id" integer NOT NULL;
ALTER TABLE "test_temp" ALTER COLUMN "temp2_id" DROP DEFAULT;
CREATE INDEX "test_temp_7aa0f6ee" ON "test_temp" ("temp2_id");
ALTER TABLE "test_temp"
  ADD CONSTRAINT "test_temp_temp2_id_246c99a640fbbd72_fk_test_temp2_id"
    FOREIGN KEY ("temp2_id")
    REFERENCES "test_temp2" ("id")
    DEFERRABLE INITIALLY DEFERRED;

COMMIT;

주의점

적용된 마이그레이션 파일은 이전 버전에 대해 의존성을 가지기 때문에 절대 삭제해서는 안된다.

삭제하려면 반드시 적용을 해제하고 삭제해야 한다.

 

 

 

참고

 

https://tibetsandfox.tistory.com/24

 

장고(Django) - 마이그레이션(Migration)

마이그레이션(Migration)이란? 장고 공식 문서에서는 마이그레이션이 모델의 변경 내역을 DB *스키마에 적용시키는 장고의 방법이라고 설명하고 있습니다. 장고는 ORM을 사용하기 때문에 models.py와

tibetsandfox.tistory.com

http://pythonstudy.xyz/python/article/309-DB-%EC%84%A4%EC%A0%95%EA%B3%BC-Migration

 

예제로 배우는 파이썬 프로그래밍 - DB 설정과 Migration

1. DB Migration Django에서 Model 클래스를 생성하고 난 후, 해당 모델에 상응하는 테이블을 데이타베이스에서 생성할 수 있다. Python 모델 클래스의 수정 (및 생성 )을 DB에 적용하는 과정을 Migration이라

pythonstudy.xyz

 

https://brownbears.tistory.com/443

 

[Django] Migration 기능

장고의 명령어 중, migrate, makemigrations 와 같은 명령어가 있습니다. 이러한 명령어는 models.py에 정의된 모델의 생성/변경 내역을 히스토리 관리, 데이터베이스에 적용 등과 같은 기능을 제공하여

brownbears.tistory.com