[ Django ] postgresql을 사용할 때 migration 관련 오류
🌈 프로그래밍/Django

[ Django ] postgresql을 사용할 때 migration 관련 오류

반응형

이번 포스팅에서는 Django 프로젝트를 진행하면서 발생한 오류에 대한 기록을 하려고 한다.

우선 Django는 python 언어를 기반으로 한 프레임워크이고, 각 모듈을 app이라고 부른다.

그러니까 Nestjs 프로젝트에서 nest g mo "모듈 이름" 명령을 사용해서 모듈을 생성하는 것처럼

Django에서는 app을 생성할 때 프로젝트 폴더 내에서 아래와 같은 명령을 사용한다.

$cd 프로젝트
$python manage.py startapp 앱이름

위와 같이 만들어 준다. 프로젝트 생성부터 이미 진행했다고 가정한 뒤, 오류 사항을 기록하려고 한다.

 

migration?

그전에! migration이라는 것을 미리 좀 알아두면 좋을 것 같아 기록하려고 한다.

Django에서 migration(마이그레이션)이란 쉽게 말해서 python으로 작성된 코드(모델)를 DB가 알아들을 수 있도록 하는 것이다.

즉, Model을 정의한 그대로 DB의 테이블 정보로 바꿔주는 것이라고 생각하면 쉬울 것 같다.

Django는 객체(Object)를 정의하고 관계(Relation)로 매핑하는 내장 ORM을 사용한다.

 

Django migration 순서

Django는 각 app마다 model.py라는 파일이 존재한다.

모델을 작성한 뒤, 아래의 순서대로 DB에 모델이 변경되었다고 알려주어야 한다.

마이그레이션 폴더 캡쳐 화면

위의 이미지처럼 새롭게 migration을 진행하면 모델의 어떤 부분이 바뀌었는지 변경 사항을 자동으로 이력을 남기는 모습이다.

$python manage.py makemigrations

$python manage.py migrate

알려주지 않고 무작정 서버를 켰다간 어마어마한 오류를 맞이할 것이다..

아무튼 위의 과정을 마쳤다면 서버 실행!

$python manage.py runserver

 

오류 상황

먼저, 오류가 발생한 상황을 설명하자면 postgresql을 사용하여 연결하였고 product라는 app을 연결해서 진행하고 있었다.

admin을 등록해 localhost/admin 페이지를 사용하고 있는 상태였다.

기존 app(admin)을 이미 migration 한 뒤, 새로운 app(users)을 생성해서 migration을 진행하려고 할 때 발생하였다.

아래가 맨 마지막 줄에 발생한 오류이다.

django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency users.0001_initial on database 'default'.

그러니까 admin이 적용된 상태에서 users를 적용하면 안 되고 users를 먼저 migration을 진행하여야 한다는

migration의 순서와 관련된 오류인 것 같았다..

현재 내 프로젝트에서 migration이 진행된 상태에 대한 명령어를 입력해 보았다.

$python manage.py showmigrations

 

현재 project의 migration 진행 상태

상태를 보니 내가 만든 users 앱은 진행되지 않은 모습이다.

그래서 여기저기서 migration을 초기화하는 방법을 알아보았는데.. 잘 해결되지 않았다..

 

해결 방법

그래서 해결한 방법으로는 새로 그냥 DB를 파버렸다.. 그래서 DB를 파고 새로 연결하는 부분을 까먹지 않으려고 포스팅을 하는 것!

 

postgresql DB 생성

postgres가 설치되어있다고 가정하고, 터미널에서 postgres 명령어를 사용하기 위해서 아래와 같이 입력한다.

psql postgres

그러면 터미널의 형태가 postgres=#과 같은 형태로 변경될 것이다. 변경되지 않는다면 설치를 하도록 하자.

다음으로는 DB를 생성하는 명령을 입력한다.

postgres=# create database new_db;

잘 생성되었는지 확인은 \l(List) 명령을 통해서 확인할 수 있다.

 

생성된 DB로 이동

그러면 만들어진 DB로 이동하도록 하자.

postgres=# \c new_db

성공적으로 되었다면 또 한 번 터미널의 형태가 new_db=#과 같은 형태로 변경되었을 것이다.

그 상태로 \dt(database table) 명령을 입력해서 현재 DB의 모든 relations(table)을 확인할 수 있다.

아직은 아무것도 진행하지 않고 생성만 진행하였기 때문에 Did not find any relations.라고 뜰 것이다.

 

프로젝트 내 설정

postgres DB를 사용할 프로젝트 내에서 아래의 명령을 통해서 설치를 진행해 준다.

pip install --no-binary :all: psycopg2

 

프로젝트의 settings.py로 이동

그다음으로 할 일은 Django 프로젝트 내에서 postgres DB를 사용하겠다는 설정을 해주어야 한다.

setting.py부분에서 내리다 보면 DATABASES라는 부분이 있을 것이다. 그 부분을 아래와 같이 수정하도록 한다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'new_db',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': 'localhost',
        'PORT': '',
    }
}

여기서 'USER''PASSWORD'는 admin 페이지를 사용할 때 login 하기 위한 계정을 설정하는 부분이다.

$python manage.py createsuperuser

위의 명령을 통해서 생성된 Nickname과 Password를 의미한다.

 

migration 적용하기

이제 마지막으로 만든 app의 models.py를 migration 진행 후 서버를 ON 해보자!

$python manage.py makemigrations

$python manage.py migrate

$python manage.py runserver

 

최종 migration 진행 결과

순서를 보니 users.001_initial이 적용되고 그 후에 admin 부분이 migration 되었다!

 

반응형