- 일단 이 상태에서 loaddata 명령어를 쓰는 건 안 된다
- 중복되는 데이터가 있든 말든 기존 데이터에 추가되기 때문...
- 어차피 기존 데이터에는 추가된 필드에 내용이 없는데 괜찮겠냐 라는 메시지가 나온다
2가지 방법이 있다
<사전 준비>
- makemigrations 할 때 방해가 되는 것이 있다
- 데이터베이스의 데이터를 불러오는 부분이다
- 우리의 recommend_ml.py 파일에는 데이터베이스에서 데이터를 불러오는 부분이 있어서 makemigrations가 안 된다
- 관련 부분을 다 주석 처리 해야 한다
- 변경사항이 하나도 없는 상태에서 하자 다 끝나면 git stash로 주석 처리한 거 한 번에 돌려놓을 거니까
- exhibitions/recommend_ml.py
- ctrl + a 해서 전체 선택 후 ctrl + / 로 주석 처리한다
- exhibitions/views.py
- import 부분인 19번째 줄, 실제 함수를 사용하는 부분인 73번째 줄을 주석 처리 한다
<첫 번째 방법 : 데이터베이스 날리기>
- 지금 기본 데이터베이스를 쓰고 있는데 postgresql에서 기본 데이터베이스는 날릴 수 없는 것 같다
- 추후에 또 이런 일이 발생할 수 있으니 그냥 삭제 가능한 데이터베이스를 하나 더 만들었다
- vscode에서 데이터베이스 생성하기(선택사항)
- 이 순서대로 데이터베이스를 새로 만들고 .env 파일에서 데이터베이스명 부분을 바꾼 데이터베이스로 변경해준다
- 기존 데이터베이스의 테이블 전부 삭제하기
- 현재 DB가 기본 DB가 아닌 삭제 가능한 데이터베이스여도 열려 있으면 삭제가 안 돼서 해당 데이터베이스를 닫고 다른 데이터베이스에서 아래 명령어를 쓰는 것보다는 그냥 테이블 다 선택해서 날려주는 게 편하다
drop database 데이터베이스명
- 이렇게 테이블을 모두 선택한다(첫 번째 테이블 클릭 후 shift 누른 상태로 맨 아래 테이블을 선택하면 다 선택됨)
- 마우스 우클릭 해서 drop을 누른다
- yes 버튼 누른다
- 3~4 테이블 정도 남는데 같은 방법으로 drop 해주면 된다
- 이제 기존 데이터베이스는 볼 일이 없으니 select show database를 눌러 새로운 데이터베이스만 체크해준다
- migrate
- 모델이 바뀐 게 아니라면 makemigrations를 했을 땐 No changes detected라고 뜰 거다
python manage.py migrate
- 데이터베이스에 테이블이 생성됐는지 확인한다
- createsuperuser
- 모든 테이블을 삭제해서 superuser를 다시 생성해야 한다
python manage.py createsuperuser
- 필드 최대 길이 늘리기
- 테이블이 새로 생성되었으니 필드 길이도 다시 조정해야 한다
ALTER TABLE exhibitions_exhibition ALTER COLUMN content TYPE VARCHAR (30000);
ALTER TABLE exhibitions_exhibition ALTER COLUMN image TYPE VARCHAR (200);
ALTER TABLE exhibitions_exhibition ALTER COLUMN direct_url TYPE VARCHAR (200);
- 다음에 데이터베이스 삭제 대신 테이블만 삭제할 예정이라면 쿼리를 만들어 두는 것도 좋다
- 명령어 입력 후 Execute를 차례로 누르면 된다
- loaddata
python manage.py loaddata exhibitions/utils_data.json
- 데이터베이스에 필드가 추가된 데이터가 제대로 들어왔다..!
<두 번째 방법 : 테이블 삭제하기>
- 테이블 삭제하기
- 나중에 또 이런 일이 있을 수 있으니 쿼리를 생성했다 ..ㅎ
DROP Table exhibitions_exhibition CASCADE;
DROP Table exhibitions_exhibition_likes CASCADE;
DROP Table accompanies_accompany CASCADE;
DROP Table accompanies_apply CASCADE;
DROP Table reviews_review CASCADE;
- 차례대로 Execute를 누른다
- CASCADE를 안 붙이면 관계된 테이블이 있어서 삭제가 안 된다고 뜬다
- exhibitions_exhibition 테이블만 삭제하면 나중에 migrate 할 때 에러 뜬다
- 위 테이블과 관계 있는 모든 테이블을 같이 지워줘야 한다,,
- django_migrations
- 테이블 중 위 이름을 가진 테이블이 있다
- 여기서 app에 exhibitions, acommpanies, reviews는 다 지운다
- 나는 방금 migrate 해서 하나밖에 없는데 같은 app에 여러 name 행들이 있을 수 있다
- 찾아서 다 선택해서 삭제 버튼을 누른다
- 이 다음부터는 데이터베이스 아예 날릴 때랑 똑같다 createsuperuser는 할 필요없다(user 테이블 삭제 안 했으니까)
- migrate
python manage.py migrate
- 필드 최대 길이 늘리기
ALTER TABLE exhibitions_exhibition ALTER COLUMN content TYPE VARCHAR (30000);
ALTER TABLE exhibitions_exhibition ALTER COLUMN image TYPE VARCHAR (200);
ALTER TABLE exhibitions_exhibition ALTER COLUMN direct_url TYPE VARCHAR (200);
- loaddata
python manage.py loaddata exhibitions/utils_data.json
<주석 처리한 거 되돌려 놓기>
- *주의* 변경사항이 주석 처리한 것만 있는 상태여야 한다
git stash
- 마지막으로 런서버도 잘 되는지 확인해 준다
python manage.py runserver
<판단하기/>
- 두 방법 모두 배포한 이후라면 좋은 방법은 아니기 때문에 다른 방법을 찾아야 한다
- 개발 단계였기 때문에 삭제라는 다소 무식한 방법을 사용했다
- 이 두 방법 중에 굳이 고르자면 테이블을 삭제하는 2번째 방법이 더 낫다
- 왜냐하면 데이터베이스를 삭제하면 유저 정보도 사라져서 조금 더 귀찮아지는 것 같다
- 관리자 계정도 새로 만들어야 하고, 테스트 유저도 다시 만들어야 하니...