Django-PostgreSQL Unique Constraint

김의석 ·2024년 5월 8일
0

Django

목록 보기
26/39
post-thumbnail

models.py에서 model의 field 수정 후 개발서버에서 migrate 시 발생한 문제 해결 과정 기술

문제정의

  • 로컬개발 서버환경에서 model의 field 수정 후 migrate 완료 후 커밋

  • 개발서버에 반영하기 위해 커밋을 pull

  • 개발서버 변경 된 models.py migrate

  • 다음과 같이 migrate 실행이 되지않음을 확인

접근

There is no unique constraint matching given keys for referenced table "checking_member"

  • checking_member에서 외래키로 참조하는 model의 field unique constraint 해당하지 않는다는 것.

  • 이를 해결하기 위해서는 두 가지 방법이 있음(참고)

    • models.py에서 외래키로 사용되는 field에 unique=True를 지정하여 unique constraint에 만족하게 하는 것.
    • 두번째 직접 PostgreSQL 명령어를 통해 외래키로 사용되는 field에 unique constraint를 추가하는 것.

  • 미안하지만 이미 models.py를 확인하면 외래키로 사용되는 name field는 unique=True가 지정되었고 로컬개발환경에서는 makemigrations와 migrate가 문제 없이 실행 됨.

    • 이때 로컬개발환경은 sqlite3
  • PostgreSQL 컨테이너에 접속해서 직접 unique constraint를 적용하기로 함

PosrgreSQL에 직접 unique constraint 하기

docker-compose.yml 확인

  • docker-compose로 실행 된 db컨테이너의 이름 'db'를 확인

개발서버 터미널에서 db 컨테이너 접속

sudo docker-compose exec db psql -U poko_db_user poko_db_dev
  • user name : poko_db_user
  • db name : poko_db_dev

qsql 명령어 입력

ALTER TABLE checking_member ADD CONSTRAINT unique_name UNIQUE ("name");
  • ALTER TABLE

    • 데이터베이스 테이블의 구조를 변경
  • ADD CONSTRAINT unique_name

    • 새로운 제약 조건의 이름을 설정.
    • 이 새로운 제약 조건이 어떤 종류의 제약 조건인지와 이름을 설정하는 역할.
  • UNIQUE

    • 지정한 제약 조건으로 해당 필드의 값을 고유하게 함.

Unique Constraint란?

  • 고유(unique) 제약 조건은 데이터베이스에서 특정 열(또는 여러 열의 조합)의 값이 고유하도록 강제하는 규칙

  • 외래키로 참조되는 필드는 반드시 Unique Constraint가 적용되어야 한다.

  • 외래키 참조하는 모델의 데이터를 외래키를 통해 식별 하기 때문에.

결과

  • \d 명령어로 변경 한 checking_member table을 확인
                               Table "public.checking_member"
   Column   |          Type          | Collation | Nullable |             Default              
------------+------------------------+-----------+----------+----------------------------------
 id         | bigint                 |           | not null | generated by default as identity
 name       | character varying(5)   |           | not null | 
 attendance | integer                |           | not null | 
 absent     | integer                |           | not null | 
 teacher_id | character varying(150) |           | not null | 
 gender     | character varying(3)   |           |          | 
 grade      | character varying(3)   |           |          | 
Indexes:
    "checking_member_pkey" PRIMARY KEY, btree (id)
    "unique_name" UNIQUE CONSTRAINT, btree (name)
    "checking_member_teacher_id_7bd61e52" btree (teacher_id)
Foreign-key constraints:
    "checking_member_teacher_id_7bd61e52_fk_auth_user_username" FOREIGN KEY (teacher_id) REFERENCES auth
_user(username) DEFERRABLE INITIALLY DEFERRED

  • psql 명령어로 지정한 unique_name으로 checking_member의 name field가 unique constraint가 적용 됨을 확인!

  • 이후 개발서버에서 migrate
    • migrate 문제가 되었던 033_migration 파일이 정상적으로 migrate 실행 됨.

참고

  • 로컬개발 환경의 sqlite3에서 033_migration 파일 정상적으로 migrate 되었으나 개발서버의 psotgresql은 직접 unique constraint를 적용해야 문제가 해결되었다. 이 차이에 대해 파악이 필요.
profile
널리 이롭게

0개의 댓글