운영 중인 서비스에 새로운 기능을 추가로 개발하면서 데이터베이스 구조가 굉장히 많이 변경됐다. 데이터의 양이 많지 않은 상황이라 새로운 데이터베이스에 기존 데이터를 마이그레이션하고 추가적인 필드를 직접 추가하는 방식으로 진행하는 것이 간편할 것이라고 판단했다. 파이참에서 제공하는 데이터베이스 접근 툴을 사용하여 기존 데이터를 쉽게 마이그레이션 할 수 있었다.
위 과정 이후에 새로운 데이터를 생성하려고 하는데 다음과 같은 에러가 발생했다.
해당 에러는 데이터베이스에 새로운 레코드를 삽입하려 할 때, 해당 레코드의 pk 값이 이미 데이터베이스에 존재하기 때문에 발생한다. 이 문제의 주된 원인은 데이터베이스 마이그레이션 시 데이터만 옮기고, 자동 증가 필드에 대한 시퀀스 정보를 함께 옮기지 않았기 때문이다. Django 모델에서 id 필드는 기본적으로 AutoField로 설정되어 있으며, 이는 데이터베이스에서 시퀀스를 사용하여 고유한 값을 자동으로 할당한다. 그리고 각 테이블에 대한 시퀀스는 일반적으로 pg_sequence라는 시스템 카탈로그에 저장(PostgreSQL 기준)되며, 테이블마다 개별적인 시퀀스를 관리한다.
해당 문제를 해결하기 위해선, 자동 증가 필드의 시퀀스를 현재 최대 값 이후로 설정해 줘야 한다. PostgreSQL 기준으로 아래와 같은 명령으로 해결할 수 있다.
SELECT setval(pg_get_serial_sequence('table_name', 'id'), (SELECT MAX(id) FROM table_name) + 1);
참고 자료