블로그를 해킹당한 이후로는 관리하기 귀찮아서 쳐다보지도 않았는데, 오늘 코딩하다가 무언가 기록해야할 필요성이 있다고 생각되는 것을 알게 되었는데 이것을 기록할 곳이 없어서 잠시 고민하다가 결국 여기로 다시 돌아왔다.


자주 적지는 못하(않?)겠지만 그래도 오늘처럼 알아내는데 시간이 제법 걸리거나, 다음에 또 쓸 가능성이 있는 것들은 같은 사항으로 고민하는 다른 코더들을 위해, 그리고 바보같이 또 인터넷을 헤매며 삽질하고 있을 미래의 나를 위해 적어두어야겠다.



아, 참고로 이 방법은 1.7.3의 장고와 파이선 3.x 에서 이용가능하다.

issue가 올라와 있으니까 언젠가는 built-in으로 사용가능하겠지만, 그 전까지는 현재 버전의 상황에 맞게 살짝 바꿔서 사용해야 할 것이다.



그럼 배경설명부터...


django에서 모델을 정의할 때, 일반적으로는 pk를 서술하지 않는다.

왜냐하면 아무 필드에 primary_key=True를 먹이지 않는한, 장고에서 알아서 만들어서 추가해준다.

https://docs.djangoproject.com/en/1.7/topics/db/models/#automatic-primary-key-fields

https://docs.djangoproject.com/en/1.7/ref/models/fields/#autofield


일반적인 작은 웹 프로젝트의 경우에는 별 문제없이 사용할 수 있지만, 상황에 따라 pk가 일정 범위를 넘는 경우가 생길 수 있는데, 이때는 int만으로는 버거울 수도 있다.



그래서 아무 생각없이 BigIntegerField를 id로 정의하고 primary_key를 주고나서 새로생긴 migrate 기능을 이용해서 alter를 시도하니 안되더라... (내가 잘못한걸 수도 있음...)


인터넷을 찾아보니 구글에서도 비슷한 질문을 올린 사람들이 꽤나 있었다.

위에 issue도 올라온지 4년이 넘었는데 아직까지 기능추가가 되지 않았더라.

하긴, 1씩 커져서 저 큰 숫자를 넘긴다는게 정말 쉽지는 않겠지...


첫번째 댓글에 있는

이것도 시도해봤는데, 단순히 id로만 쓰는 경우에는 이걸로 해결될 수도 있겠지만, 나의 경우와 같이 다른 테이블에 foreign key로 묶여서 연결되어 있는 경우라면 아마 안될거다...


그래서 stackoverflow에서도 이것저것 찾아서 시도해보다가 이런걸 발견했다.

https://gist.github.com/thomasyip/3158388

설마 될까? 싶어서 가져와서 indentation만 조금 고쳐서 써봤는데 db 엔진을 매칭하는 부분이 현재 버전과 조금 달라 안되더라.

파이썬이나 장고를 잘 아는 사람은 여기까지만 읽어도 쉽게 해결하겠지만, 아닌 사람들(+미래의 나)을 위해 내가 실제 쓴 stub을 밑에 적어두도록 하겠다.

그리고 이전 버전에서 쓰였던 long()이 있기때문에 이것도 int()로 바꿔주었다

저작권은 github 링크의 저자에게 있는거겠지...?

그러니 이거 안된다, 저거 안된다 저에게는 묻지 말아주세요... 저도 아직 장고 초보랍니다 ㅜ_ㅜ

아, db는 mysql을 쓰고 있는 중이다. 당연히, 다른 db엔진에서는 전혀 테스트 된 바 없음...


// 추가

다른 db엔진에서 테스트 해볼 기회는 없었지만, sqlite3의 경우에는 "BIGINT"로 해야하는 것 같다...




이거 넣으려고 syntaxhighlighter까지 깔았다... 진작 써볼껄... 이거 좋네.



'Projects > django' 카테고리의 다른 글

custom json serializer in django  (0) 2015.05.14
Posted by 병아리

사이드바 열기