티스토리 뷰

여러 대의 컴퓨터에서 작업을 하다보니 migrate 때문에 에러가 잦다.


주로 사용하던 컴퓨터가 git 에러가 계속 발생하여 컴퓨터를 옮겼다.

(댓글에 의하면 컴퓨터 상의 에러일 수도 있다고 한다. 새로 깔아야할까)


그런데 .gitignore 파일이 계속 제대로 적용되지 않아 migration file이 push된다.

git이 참 말썽이다.


다른 컴퓨터에서 작업하는데, migration 파일이 pull 되는 바람에 원래 것들과 충돌을 일으켰다.

나는 짜증이 나서,


Migration 파일을 지워버렸다 - dependency error

migration 파일을 잘 보면 dependencies라고 다른 파일과 얽혀있다.
예를 들면 5번 파일을 지우면, migrate할 때 6번 파일이 5번 파일을 찾을 수 없다고 에러가 난다.

근데 난 이미 파일을 지워버렸는걸.

dependency를 어떻게 없애버릴까 고민했다.
수동으로 그 부분을 지워버려도 된다는 글이 있긴 했다.
(migration 파일 자체를 지워도 된다는데...)

곰곰이 생각해보니 migrations 파일은 model에 변동사항을 알려주고 sql에 알려주는 역할을 하는 것 같다.
그럼 이미 migrate가 끝났으면 필요없는 거 아닌가?

그런 생각을 하는 와중에, 잘 정리되어 있는 글 하나를 발견했다.

step1은 db에 아무것도 없을 때, 그냥 db 자체를 밀어버리는(flush)하는 것이다.

sg(설문G)는 처음 적용하는 것이라 db가 없으니 그냥 밀어도 되지만,

이미 만든 앱 같은 경우는 db가 차있으니 step2를 꼭 이용해라.


나는 다른 앱의 모델끼리 dependency가 존재한다.

A라는 모델이 B를 foreignkey로 가지고 있다.

그래서 B의 migration file을 정리할 때, A까지 같이 해줘야 한다.


그러면 일단 dependency 문제 해결.


models.py의 fields가 sql에 제대로 적용되지 않았다.

migration 파일은 sql(Mysql)에 변동사항을 알려주는 애라고 말했다.
그런데 migration파일이 충돌하다보니 git pull 이후에 manage.py migrate를 할 수 없었다.
당연히 sql에 바뀐 모델의 필드가 적용되지 않았다.

git pull -> migration file 충돌 / 삭제 -> sql에 models.py의 변동사항 적용 안됨 -> model objects 생성 할 때 field가 존재하지 않는다는 오류 발생 -> 다시 makemigration -> "No changes" ??? (migration file을 삭제해서 상태가 이상함) -> migrate해도 변동사항 적용 안됨


오류 내용은 OperationalError: (1054, "Unknown column '(app_name).(field_name)' in 'field list'")

옛날 버전에서는 syncdb를 하면 된다는 글이 있다.(syncdb는 이제 없는 명령어이다.)


manage.py dbshell로 mysql에 접속해본다.

DESCRIBE (app name)_(model name);

그러면 각 field가 보일텐데, models.py에 있는 게 적용이 안된 경우가 보일 것이다.
하... 어떻게 하지... migration file을 수동으로 바꿔야 하나, 고민했다.
(수동으로 migration file을 바꾸는 것도 방법이 될 것이다)

그러다 다른 사람이 해결한 방법을 발견했다.

해결방법은 mysql에 없는 field를 만들어주는 것이다.
1. manage.py dbshell 로 sql(database) 접속

2. ALTER TABLE (table name) ADD COLUMN `(field name)` INT;
만약 table 이름을 모르겠으면 SHOW TABLES;로 확인
int가 아니고 char라도 상관 없음. 그냥 아무 type이라도 가능.

3. models.py에서 field를 주석처리 (nano나 vi 사용)

4. maange.py makemigrations     #change가 있어야 함! field가 없어진 것 확인
5. manage.py migrate                #적용 잘 되었다는 표시가 있어야함!

6. models.py에서 field를 다시 살려냄(주석 처리 취소)

7. manage.py makemigrations     #change가 있어야 함! field가 생긴 것 확인
8. manage.py migrate                #적용 잘 되었다는 표시가 있어야함!

참고 : sql 명령어 (alter table)


됐다.

나는 잘 됐다.


그럼 이만.


------------------------------------------------------------------------------------------------------

migration / sql 관련 에러 모음


참고로 예전에 migrate를 했는데도 table이 생성되지 않은 적이 있다.

예전 글 참고. -> 해결책은 --fake zero였다.


또 migrate 관련 에러로, model이 존재하지 않는다는 에러가 발생한 적이 있다.

model과 view의 import 관계가 얽혀서 그렇게 된 것이었다.


sql 관련 에러로는 character type 설정 문제가 있었다.

댓글