스터디/Web

[Django] 모델 수정하고 삭제하기

sollllllll 2022. 2. 8. 21:51

프로젝트를 진행하다가 초기에 작성했던 모델 내용을 수정하고,

데이터를 모두 삭제해야 할 이슈가 발생해서 관련 내용을 수행하고 글로 정리해보려고 한다.

 

 

 

(1) 모델 수정하기

 

기존에 작성했던 모델의 내용은 다음과 같다.

 

# app/models.py

class Review(models.Model):
    reviewId = models.IntegerField(primary_key=True)	# 삭제할 내용
    userId = models.ForeignKey(User, on_delete=models.CASCADE)
    bookId = models.CharField(max_length=30)
    reviewTxt = models.TextField()

이 내용에서 서평 제목, 서평 평점, 서평 작성날짜 필드를 추가하고

PK인 reviewId 필드를 삭제하여 장고 모델에서 기본으로 제공하는 id를 PK로 사용하려고 한다.

 

 

변경 사항을 반영하여 파일을 먼저 수정한다.

# app/models.py

class Review(models.Model):
    userId = models.ForeignKey(User, on_delete=models.CASCADE)
    bookId = models.CharField(max_length=30)
    reviewTitle = models.CharField(max_length=200)	# 추가한 내용
    reviewDate = models.DateField(auto_now_add=True)	# 추가한 내용
    reviewRate = models.IntegerField()			# 추가한 내용
    reviewTxt = models.TextField()

서평 날짜(reviewDate) 필드를 models.DateField() 로 설정하고, 속성에 auto_now_add=True 를 주어서

데이터가 생성된 날짜를 필드 내용으로 설정하고 데이터가 변경되어도 날짜가 변하지 않도록 설정했다.

* models.DateField() 에서 auto_now 속성을 True 로 설정하면 업데이트 된 날짜로 반영된다.

 

 

 

 

(2) DB 수정하기

 

models.py 파일을 수정하면 일반적으로는 migrate 명령을 수행해야 하지만,

PK 필드가 삭제되었고 기존의 데이터도 전부 삭제해야 하기 때문에 테이블 자체를 삭제하고

새로 작성한 내용으로 테이블을 다시 생성하기로 하였다.

 

그러나 migration 파일이 계속해서 남아있으면 원활하게 DB에 반영되지 않기 때문에

테이블 삭제는 다음의 순서를 따라서 수행했다.

 

 

 <1> migration 파일 삭제 

모델을 생성하고 나서 migrate 를 한 번이라도 수행했다면 migrations 폴더가 생성되는데,

해당 폴더 안에 있는 파일들 중 __init__.py 파일을 제외한 모든 파일을 삭제한다.

migration 파일 안에는 기존에 가지고 있던 모델의 정보가 들어있기 때문에

해당 파일들을 삭제해야 새롭게 모델을 생성할 때 영향을 받지 않는다.

 

 

 <2> migrations 테이블 데이터 삭제 

django_migrations 테이블 안에 해당 앱의 migrations 내용이 있기 때문에 해당 레코드도 삭제한다.

프로그램은 SQLite 의 GUI 도구인 DB Brower for SQLite 를 사용했다.

 

 

 <3> 테이블 삭제 

마지막으로는 테이블을 삭제한다.

 

 

 

 

(3) 변경사항 적용하기

 

파일의 내용을 수정하고 DB 에서도 관련 내용을 모두 삭제했다면

마지막 단계는 변경한 내용을 프로젝트에 적용하는 단계이다.

cmd 창을 열어서 다음 명령어들을 차례대로 입력한다.

 

makemigrations 명령어는 migrate 명령을 수행하기에 앞서

모델과 관련한 SQL 내용을 담은 migrations 파일을 생성해주는 명령어이다.

즉, 우리가 (2)-<1> 단계에서 삭제했던 파일을 변경된 내용에 맞춰서 다시 생성하는 것이다.

(venv) C:\생략\Project> python manage.py makemigrations

 

sqlmigrate 명령어를 입력하면 migrate 를 수행할 때 어떤 SQL 구문이 수행되는지 자세히 볼 수 있다.

app 뒤의 숫자는 migrations 파일의 번호로, 해당 파일이 담고 있는 SQL 구문을 보여주게 된다.

(venv) C:\생략\Project> python manage.py sqlmigrate app 0001

 

migrate 명령을 수행하면 모델을 변경한 내용이 프로젝트에 적용된다.

(venv) C:\생략\Project> python manage.py migrate

 

 

 

위 과정을 거쳐 장고 프로젝트의 앱 모델을 변경하고 삭제하는 작업을 완료했다.

새롭게 테이블을 만들고 데이터를 입력해보았다.

아래 페이지는 REST API 를 사용했고, 관련 내용은 다른 포스트에서 자세히 다루었다.