[Error] dJango migrations - OperationalError

Hailee·2020년 12월 1일
0

[ TIL ]

목록 보기
23/40
post-thumbnail

migrations 탐구하기!


CRUD (1) 실습 도중 발생한 에러!

우선 이러한 상황이다👇🏻

  1. models.py 내부에 A, B, C 테이블 생성
  2. C 테이블이 별로여서 삭제하고 싶어짐
    -> MySQL에서 직접 drop table C 실행
  3. models.py에 C 테이블 관련 코드 삭제 후 다른 테이블 생성 코드 입력
  4. python manage.py makemigrations는 멀쩡히 실행되지만
    python manage.py migrate를 실행하면
    OperationalError(1051,"Unknown table") 혹은 OperationalError(1050,"Table already exists") 에러 발생

멘토님께 질문한 결과, models.py에 적힌 코드와 이미 만들어진 migrations 내 파일들 간 충돌이라고 하셨다.

models.py는 DB 관련해서 생성, 수정하는 역할을 담당한다.
예를 들면, models.py에 적어둔 코드대로 테이블을 생성하고, 수정하게 되는 것!

내가 만약 C 테이블을 지우고 싶었다면, models.py 내부에서 해당 테이블을 생성하는 코드를 지우고 실행했다면
새로 생성된 migrations 파일에 delete 하는 코드가 생성되었을 것이다.

하지만 내가 MySQL 자체에서 drop table을 실행했기 때문에,
이미 존재하지 않는 테이블에 대해서
migrations 파일은 delete를 시도하고 있으니
지울 테이블이 없다고 에러가 나는 것!

두번째 migrations 파일에서 발견된 코드! 👇🏻

이러한 DB 관련 코드들을 보고싶다면 migrations 내부를 확인하면 된다!

> python manage.py showmigrations

👆🏻 위 코드를 실행하면 migrations 파일들의 실행 결과 내역을 확인할 수 있다.

내 경우는 첫번째 파일에서 C 테이블을 생성하지만, 두번째 파일에서 C 테이블을 지우는 코드가 있으므로
두번째 파일이 실행되지 못하는 상황!

이걸 해결하고싶으면 migrations 파일을 수정하면 된다고 하셨는데
아직 내가migrations 파일 내의 모든 요소를 아는 것이 아니니
지우고 다시하는것이 나을거라고 하셔서
걍 지우고 다시 할 예정이다.

migrations 파일들이 아무 의미없이 존재하지는 않을 것이라고 생각했는데 역시나였다.
migrations는 변경 내용을 저장하고, migrate는 그 내용을 테이블에 적용시킨다.
git의 commit, merge와 비슷한 개념으로 이해하면 좋을 것 같다

  1. makemigrations는 내장 앱이나 새로 만든 앱의 SQL command를 생성한다. 하지만 변경 사항만 저장할 뿐이지 내 데이터베이스에서 실행되는 것은 아니다. 그래서 makemigrations를 한 뒤에 테이블이 생기거나 하지 않는다.

  2. 1번 뒤에 sqlmirate를 하면 makemigrations를 통해 생성된 것들을 모든 SQL commands를 볼 수 있다.

  3. migrate는 2번의 SQL commands를 데이터베이스 파일에서 실행한다. 그래서 migrate를 하고 나면 내 데이터베이스 파일 안의 앱의 테이블들이 생성된다. migrate command를 실행하고 db.sqlite3를 실행하면 모든 테이블이 생긴 것을 볼 수 있을 것이다.

개념 정리!

makemigrations

  • 각 class를 테이블을 만드는 SQL command로 만든다.

migrate

  • migrate는 migraions에서 만들어진 SQL command를 사용해서 데이터베이스에 테이블을 만드는 것
  • 변경 사항이 저장된 migrations 파일을 가지고 실제 db에 적용하는 단계
    : 처음으로 migrate를 하면 root directory에 db.sqlite3 라는 폴더가 생기고,
    sqlite3을 치면 데이터베이스에 접속할 수 있다.
    : 변경 사항을 테이블에 적용할 때 특정 앱을 지정해서 migrate를 할 수도 있다.

show migrations

  • migrate한, 즉 변경 사항을 적용한 파일들을 보여준다.
  • X로 체크된 것들은 모두 migrate가 완료된 데이터파일들
profile
웹 개발 🐷😎👊🏻🔥

0개의 댓글