지금까지 진행된 부분은
1) KRX 에서 종목정보 interface
2) 전자공시 사이트에서 공시정보 interface(리포트 속 내용은 추후에 진행하기로 결정)
3) FnGuide 에서 제공하는 종목별 각종 정보 interface
조만간 정리해서 올리도록 하겠다
오늘 포스팅을 하는 이유는...
빌어먹을 django 때문에 하루를 날려버렸다ㅋ
혹시 잊어버릴까봐 미리 포스팅을 해둔다
django 에서 빈번하게 models 를 수정하다가 발생하는 오류이다!!!
그동안 1, 2, 3을 진행하면서 수도없이 models.py 파일을 수정하고 이를 반영하였다.
명령어는 아래와 같다.
python manage.py makemigrations
python manage.py migrate
최종적으로 아래와 같이 이쁘게 결과가 나와줘야 정상인데...
이렇게 나오기까지 엄청나게 많은 오류를 뱉어내었다
에러 종류별로 정리를 해보면
1) table 'xxxxxxxxxxxxx' has more than one primary key
2) You are trying to add a non-nullable field 'id' to 'xxxxxxxxxxxxx' without a default
3) A model can't have more than one AutoField.
4) table "xxxxxxxxxxxxx" already exists
5) no such table: xxxxxxxxxxxxx
뭐 대충 이러하다
1~3번은 models.py 를 잘못 수정하였을때 발생하였다.
django 에서는 다른 관계형db 와는 약간 다르게 여러개의 컬럼에 primary_key 설정을 할 수 없었다.
예를 들면 아래와 같은 테이블은 1번과 같은 에러를 발생시키며 생성할 수 없는 것이다.
class xxxxxxxxxxx(models.Model): id = models.BigIntegerField(primary_key=True, default=0) col1 = models.CharField(primary_key=True, max_length=20)
col2 = models.TextField(primary_key=True)
col3 = models.CharField(primary_key=True, max_length=4)
col4 = models.CharField(primary_key=True, max_length=2)
col5 = models.IntegerField(primary_key=True)
col6 = models.CharField(max_length=20) col7 = models.CharField(primary_key=True, max_length=100)
col8 = models.BigIntegerField()
col9 = models.TextField(null=True)
그럴땐 아래와 같이 table class에 inner class 로 Meta를 생성해주고 unique_together 라는 속성으로 하나의 primary_key 처럼 관리될 column을 묶어주면 된다.class xxxxxxxxxxx(models.Model): class Meta:
unique_together = (('id', 'col1', 'col2', 'col3', 'col4', 'col5', 'col7'),)
id = models.BigIntegerField(primary_key=True, default=0)
col1 = models.CharField(primary_key=True, max_length=20)
col2 = models.TextField(primary_key=True)
col3 = models.CharField(primary_key=True, max_length=4)
col4 = models.CharField(primary_key=True, max_length=2)
col5 = models.IntegerField(primary_key=True)
col6 = models.CharField(max_length=20) col7 = models.CharField(primary_key=True, max_length=100)
col8 = models.BigIntegerField()
col9 = models.TextField(null=True)
2번 에러는 위의 id 에서 default=0을 셋팅해주지 않아 발생했었다.
3번은 id 의 FieldType 을 BigAutoField 로 셋팅을 했을 때 발생했다. 아마도 Meta class 를 추가했을때 내부적으로 AutoField 를 생성해주는 것으로 보인다.(확실하게 확인하지는 못했다ㅠ.ㅠ)
그래도 1~3까지는 물론 고생하긴 했지만 나름 원인이 명확해서 잘 해결하고 넘어갈 수가 있었는데...헬게이트는 4번에 접어들면서다.
원인이 무엇인지는 정확히 모르겠으나 아마도 1~3번을 해결하면서 내가 수정한 코드가 제대로 반영되지 않는 것처럼 느껴져 migrations 및 pychche folder를 날리면서부터 꼬이기 시작한거 같다. 또 django_migrations 라는 테이블의 내용을 강제로 삭제를 하다보니 실제 django framework 에서 시스템에 반영되었다고 인식하는 부분과 실제 반영된 부분을 확인할 때 정보가 일치하지 않아 발생한 것으로 보인다.
진짜 해보지 않은것 없이 다해봤다
db flush 도 해보고 --fake 옵션으로 migrate 해보고 --run-syncdb 옵션으로도 migrate 해보았지만...4번과 5번 에러를 계속적으로 반복하였다...ㅠ.ㅠ
좌절은 금물
ㅎㅎ
해결은!!!
역시...sqlite 파일을 하나 백업받고 기존 파일 삭제후
python manage.py makemigrations
python manage.py migrate
명령을 수행했더니 아주 깔끔하게 재생성되었다...ㅎㅎㅎ
댓글 없음:
댓글 쓰기