안녕하세요, 오늘은 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을 작성하지 않고 해보겠습니다.
우선 가장 기본적으로, 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')
터미널에 다음과 같이 입력해줍니다.
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단계로 바로 넘어가겠습니다
이제, migration파일의 내용을 실제 테이블에 반영하기 위해 migrate작업을 해줄 시간입니다.
터미널에 다음과 같이 입력해주세요.
python manage.py migrate 앱이름 migration파일_숫자
맨 처음 migrate에서는 위와같이 app이름과 migration 파일의 버전을 명시해야 했지만,
두 번째 이후의 migrate작업에서는 장고가 자동으로 migration을 추적하기에,
app 이름과 migration버전을 생략해도 무방합니다.
터미널에 다음과 같이 간략하게 입력해도 됩니다.
python manage.py migrate
주의할 점은, 해당 스키마가 한 번 이상 migrate된 경우에만 이렇게 생략 가능하다는 것입니다!
이제, user_age와 description컬럼이 추가되었는지 확인해봅시다.
스키마를 변경했다면, pgAdmin에서 꼭 table을 우클릭해 refresh를 해주세요!
이후 해당 테이블을 우클릭해 view Data > All Rows를 해줍시다.
그럼..
두 개의 컬럼이 잘 추가되었습니다.
저희는 SQL명령어는 단 한 줄도 작성하지 않았습니다.
이렇게 저희는 SQL을 작성하지 않고 데이터베이스의 스키마를 변경했습니다.
스키마 변경시 유용하게 활용할 수 있을 것 같습니다.
감사합니다.