반응형

 django 버전은 4.0.3, 파이썬은 3.9 버전에서 실습하였습니다. 그리고, 디비는 postgresql을 쓰고 있습니다. migration을 진행하다 보면, 당황할 법한 에러 메세지를 보게 되는 경우가 있는데요. postgresql과 연결한 상태에서, migrate를 하다가 오류가 생겨서 당황하였습니다. 사실, 잘 될 거 같았기 때문입니다. 예외를 자세히 읽어 보니, relispartition이 언급되었는데요. 옛날 버전은, pg_class 테이블에 해당 필드가 없어서 생긴 문제였습니다.

 


 settings.py에서 디비 연결 정보를 정의하였습니다.

 

 

 그리고 마이그레이션이 잘 될 줄 알았는데 이게 왠걸? relispartition이 떨어졌습니다. c가 무엇인지 알아보기 위해서, 코드 내부를 타고 들어가 봐야 겠습니다. 해당 코드가 있는 폴더에서 relispartition이라는 키워드를 몽땅 찾아보겠습니다. 저는 notepad++를 쓰고 있으니, notepad++로 찾아보겠습니다.

 

 

 파일에서 찾기를 할 건데요. 디렉토리에 적당한 위치를 넣습니다.

 

 저는 site-package 밑에 있는 모든 py 파일에 대해서 해당 키워드가 있는지 찾았습니다.

 

 그랬더니, db의 backends의 postgresql의 introspection.py에 relispartition이 있다고 나옵니다.

 


 해당 파일을 열어보면, 요런 쿼리가 하나 있는데요. 2번째 필드에 CASE WHEN 절이 있는 걸로 봐서는, relispartition 값이 참이면 'p'를 떨구고, relkind가 'm'이거나 'v'이면 'v'를, 아니면 't'를 떨궈주는 처리를 하고 있어요.

 

 

 이 c의 정체는 pg_class입니다. 테이블, 뷰와 같은 것들에 대한 메타를 저장해 놓는다고 공식 문서에서 나와 있습니다. postgres 9.6 버전이 깔려 있으니, 이 테이블에 있는 컬럼들을 보도록 하겠습니다.

 

 아무리 눈을 씻고 찾아봐도 relispartition은 찾을 수 없습니다. 어떻게 된 것일까요? 버전이 너무 낮아서 그렇습니다. 그리고 django 4.0 릴리즈 노트를 보면, Drop postgres 9.6이라고 적혀 있습니다. 그리고 4.0버전 이상부터는 postgres 10 이상을 지원한다고 적혀져 있어요.

 


 그러면 어떻게 하면 좋을까요? 버전을 높이면 됩니다. 공식 문서에 따르면 10 버전부터 relispartition이 있다고 되어 있습니다. 그러니, 버전 10 이상을 깔면 됩니다.

 

 

 그러고 나서, 다시 pg_catalog에 있는 pg_class 테이블의 필드를 보면, relispartition 필드가 있음을 알 수 있어요.

 

 이제 migration을 할 때, relispartition이 없어서 실패하지 않습니다.

반응형

댓글을 달아 주세요