티스토리 뷰

디버깅은 끝났으나 노가다를 했으므로 완벽하진 않았다.


python manage.py dumpdata taxi.recruit --natural-primary --exclude=contenttypes --exclude=auth.Permission --exclude=admin.logentry --exclude=sessions.session --indent 4 > initial_data.json

여기서 보았듯, 하나만 dumpdata 했을 때는 제대로 mysql로 변환되었다.
그러나 여러 번의 시도 결과, taxi.profile이 포함된 json파일을 dumpdata 후 loaddata하는 순간! 바로 오류가 떠버린다.


예전으로 돌아가봐야겠다.

예전에 django에서 profile을 확장할 때, 그러니까 기본 django의 user model을 사용할 때 추가적으로 사용자 정보를 추가하기 위해서 one-to-one 확장법을 선택했다.
따라한 사이트는 다음과 같다.

https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html#onetoone

이부분이 문제였던 것이다.
내 예상으로는 문제가 된 부분은 바로...
one-to-one 확장법을 사용하면, model.py에서 profile의 맨 처음에 user_id라는 field가 필요한데, auth_user(django 기본 user model)와 연결되있다는 정보를 집어 넣는 곳이다. 그래서 auth_user의 id값이 그곳에 들어간다. 자동적으로 auth_user가 사라지면 거기에 딸린 profile도 지워지도록 설정되는데 이것이 문제의 원인인 것 같다.
mysql로 loaddata를 하면, auth_user가 load됨과 동시에 새로운 profile이 만들어지는데, 다 default값으로 만들어진다. 그 다음에 profile을 load하려니 이미 default 값으로 만들어 진 것과 충돌하는 것이다. loaddata로 profile과 auth_user를 동시에 가져올 수 없어서 그렇게 된 것 같다.
내 예상이다.


여튼 그래서 나는 노가다를 택했다.

python manage.py dumpdata --natural-primary --exclude=contenttypes --exclude=auth.Permission --exclude=admin.logentry --exclude=sessions.session --exclude=taxi.profile --indent 4 > initial_data.json

taxi.profile을 dumpdata하지 않았다. 즉, taxi.profile 부분만 빼고 mysql에 저장을 해 놓은 다음 나머지는 일일히 profile에다 손으로 저장해준 것이다. 매우 비효율적이지만 다행히도 아직 사용자 수가 매우 적었기 때문에(20명) 가능할 수 있었다. 만약 사용자수가 많았다면... 난 매우 귀찮은 짓을 했어야 했다. 사용자가 적은 게 여기서 유용하다니!

(참고로 contenttype, permission, logentry, session 등은 옮길 필요가 없는 파일이다. mysql에도 자연히 생기는 파일들인 것 같다. empty set인 것도 있다)

그렇게 mysql로 데이터를 옮기는 작업이 끝났다.


mysql의 데이터를 주기적으로 백업하는 작업을 해놔야겠다. 예전에 데이터가 한 번 다 날아간 적이 있다. 그 때도 사용자가 적어서 좀 다행이었지만, 몇몇 사용자는 다시 가입해야 했던 일이 있었다. 데이터 백업의 중요성을 거기서 느끼고, 이번에 옮길 땐 혹시나 해서 여러 번 백업을 한 상태에서 옮겼다.


이제 데이터베이스 작업은 끝났다. 보안 작업만 하면 사이트는 안정화되고 조금 사이트 다워질 것이다. 그 후 바로 다른 앱을 개발할 것이다. 동시에 알림기능을 추가하고 mobile app도 발전시킬 것이다.

댓글