seminar-2020 icon indicating copy to clipboard operation
seminar-2020 copied to clipboard

동일한 username으로 회원가입을 하지 않았음에도 IntegrityError가 발생하는 이유

Open symoon9 opened this issue 3 years ago • 2 comments

어제 새벽에 Issue를 올리지 않고 질문해서 이렇게 Issue를 남깁니다.

회원가입을 시험삼아 해보다가 제목과 같은 오류가 계속해서 발생하는 일이 생겼습니다. 신기하게도 database에는 user가 생성이 되었더군요...

KakaoTalk_20200926_014616236

결론부터 말하자면 db에서 auth_user을 임의로 삭제해 생기는 문제였습니다.

어제 질의응답을 통해 username이 중복되어 생기는 문제가 아닌 auth_token의 문제라는 것을 알게되었습니다. user/serializers.py

def create()
    ...
    user = super(UserSerializer, self).create(validated_data)
    Token.objects.create(user=user)
    return user

여기서 user는 create가 되고 Token.objects.create(user=user)이 실행되는 과정에서 문제가 생기는 것입니다.

@dodo4114님 조언에 따라 MySQL workbench에서 auth_user와 authtoken table을 truncate 하였고 다시 회원가입을 해보니 201이 뜨면서 잘 되는 것을 확인할 수 있었습니다!

이 문제가 생기는 원인은 아직 찾지 못했는데 알게된다면 추가하겠습니다. 혹시 아시는 분이 계시다면 댓글로 달아주시면 감사하겠습니다.

저처럼 user을 마구 삭제해 문제가 생기신 분들께 도움이 되기를 바랍니다.

symoon9 avatar Sep 26 '20 05:09 symoon9

추가로 FK 관계인 row를 삭제하는 방법 공유합니다.

Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails

특히 auth_user가 삭제가 안될텐데 이는 token을 담는 authtoken_token table에서 참조하고 있기 때문입니다. (이때 auth_user row 삭제 시 token에 대해 cascade option을 따로 설정하지 않았기 때문으로 추정됨.)

따로 cascade를 지정하는 방법도 있겠으나 임시방편으로 (일반적으로 user는 지우면 안되기에) SET foreign_key_checks = 0;으로 외래키를 해제한 다음 삭제 후 다시 SET foreign_key_checks = 1;로 되돌리기해주면 별다른 에러 없이 auth_user와 authtoken에 대한 문제를 해결하실 수 있습니다.

YeonghyeonKO avatar Sep 26 '20 06:09 YeonghyeonKO

@YeonghyeonKO 저도 이 방법으로 해결했었습니다!! 추가 설명 감사합니다ㅎㅎ

symoon9 avatar Sep 26 '20 06:09 symoon9