[Django] postgreSQL 쿼리 작성 없이 re-migration으로 데이터베이스 스키마 변경하기

느려도 꾸준한 발걸음·2024년 6월 22일
0

Django Web dev

목록 보기
1/12

안녕하세요, 오늘은 SQL을 작성하지 않고 DB의 스키마를 변경 해보려 합니다.

지난 포스팅에서 의도적으로 발생시킨 문제를 해결해보며 방법을 알아봅시다.

지난 포스팅에서, models.py파일에 클래스를 생성할 때,
user_age와 description프로퍼티의 타입을 지정할 때, 소괄호를 작성하지 않았습니다.

from django.db import models

class PremiumMembers(models.Model):
  user_name = models.CharField(max_length=30)
  user_age = models.IntegerField
  description = models.TextField
  profile_img = models.ImageField(upload_to='profile_imgs')

소괄호를 작성하지 않으면, 테이블의 컬럼으로 변환되지 않으니,
pgAdmin에서 테이블을 조회해봐도 user_age와 description컬럼은 존재하지 않았죠.

이제, 저희는 이 두 컬럼이 추가되도록 스키마를 변경할 겁니다.
대신, SQL을 작성하지 않고 해보겠습니다.

[1] models.py 파일 수정

우선 가장 기본적으로, user_age와 description컬럼의 타입에 소괄호를 적어줍시다

from django.db import models

class PremiumMembers(models.Model):
  user_name = models.CharField(max_length=30)
  user_age = models.IntegerField() #변경된 부분1
  description = models.TextField() #변경된 부분2
  profile_img = models.ImageField(upload_to='profile_imgs')

[2] makemigrations 다시 하기

터미널에 다음과 같이 입력해줍니다.

python manage.py makemigrations 앱이름

그럼, 다음과 같은 문구를 마주하게 됩니다.

이상하죠. 이 문구는 처음 makemigrations를 해줬을 땐 보지 못했습니다.
이 문구는 존재하던 DB의 스키마를 변경하여 makemigrations를 다시 해줄 때 나타나는 문구입니다.

해결방법은 간단합니다.
수정한 컬럼의 타입에 인자로 null=True를 넘겨주면 됩니다.

다음은 수정된 코드입니다.

from django.db import models

class PremiumMembers(models.Model):
  user_name = models.CharField(max_length=30)
  user_age = models.IntegerField(null=True) #변경된 부분1
  description = models.TextField(null=True) #변경된 부분2
  profile_img = models.ImageField(upload_to='profile_imgs')

이후 다시 터미널에

python manage.py makemigrations 앱이름

를 해주면..

마이그레이션이 성공적으로 된 것을 확인할 수 있습니다.
migrations폴더로 이동해 새로 생성된 마이그레이션 파일을 확인해보겠습니다.


폴더를 보니 새로운 이름의 파일이 잘 생성되었네요. 가장 최신 버전의 migration파일인 003에 들어가보겠습니다.

파일은 다음과 같이 생겼습니다.

# Generated by Django 5.0.6 on 2024-06-22 07:56

from django.db import migrations, models


class Migration(migrations.Migration):
    dependencies = [
        ("calc", "0002_premiummembers_description_premiummembers_user_age"),
    ]

    operations = [
        migrations.AlterField(
            model_name="premiummembers",
            name="description",
            field=models.TextField(null=True),
        ),
        migrations.AlterField(
            model_name="premiummembers",
            name="user_age",
            field=models.IntegerField(null=True),
        ),
    ]

operations라는 프로퍼티에, Alterfiled라는 이름과 함께 description과 user_age가 추가되었음이 잘 기록되고 있네요.

이렇게, migrations파일은, 스키마의 변경사항을 기록하는 파일입니다.

이제 변경사항을 테이블에도 반영해야 합니다.
자세한 절차는 지난 포스팅에 정리해두었습니다.

makemigrations > sqlmigrate > migrate 순서였죠!
이중 sqlmigrate는 최초의 마이그레이션에서만 해주면 되는 작업이므로,
저희는 migrate단계로 바로 넘어가겠습니다

[3] migrate

이제, migration파일의 내용을 실제 테이블에 반영하기 위해 migrate작업을 해줄 시간입니다.

터미널에 다음과 같이 입력해주세요.

python manage.py migrate 앱이름 migration파일_숫자

맨 처음 migrate에서는 위와같이 app이름과 migration 파일의 버전을 명시해야 했지만,
두 번째 이후의 migrate작업에서는 장고가 자동으로 migration을 추적하기에,
app 이름과 migration버전을 생략해도 무방합니다.

터미널에 다음과 같이 간략하게 입력해도 됩니다.

python manage.py migrate

주의할 점은, 해당 스키마가 한 번 이상 migrate된 경우에만 이렇게 생략 가능하다는 것입니다!

[4] pgAdmin table refresh

이제, user_age와 description컬럼이 추가되었는지 확인해봅시다.

스키마를 변경했다면, pgAdmin에서 꼭 table을 우클릭해 refresh를 해주세요!

이후 해당 테이블을 우클릭해 view Data > All Rows를 해줍시다.

그럼..

두 개의 컬럼이 잘 추가되었습니다.

저희는 SQL명령어는 단 한 줄도 작성하지 않았습니다.

마무리

이렇게 저희는 SQL을 작성하지 않고 데이터베이스의 스키마를 변경했습니다.
스키마 변경시 유용하게 활용할 수 있을 것 같습니다.

감사합니다.

참고한 영상: https://www.youtube.com/watch?v=OTmQOjsl0eg

profile
웹 풀스택 개발자를 준비하고 있습니다. MERN스택을 수상하리만큼 사랑합니다.

0개의 댓글