CRUD (1) 실습 도중 발생한 에러!
우선 이러한 상황이다👇🏻
models.py
내부에 A, B, C 테이블 생성- C 테이블이 별로여서 삭제하고 싶어짐
-> MySQL에서 직접drop table C
실행models.py
에 C 테이블 관련 코드 삭제 후 다른 테이블 생성 코드 입력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와 비슷한 개념으로 이해하면 좋을 것 같다
- makemigrations는 내장 앱이나 새로 만든 앱의 SQL command를 생성한다. 하지만 변경 사항만 저장할 뿐이지 내 데이터베이스에서 실행되는 것은 아니다. 그래서 makemigrations를 한 뒤에 테이블이 생기거나 하지 않는다.
- 1번 뒤에 sqlmirate를 하면 makemigrations를 통해 생성된 것들을 모든 SQL commands를 볼 수 있다.
- 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가 완료된 데이터파일들