티스토리 뷰

django에서 이미 존재하던 db.splite3 (sqlite database)의 정보를 mysql로 옮길 것이다.


converter도 있고 코딩으로 바꾸는 것도 있지만, django의 db backup 기능으로 손쉽게 사용하는 방법이 있는 것 같다.

즉, django의 setting.py에서 sqlite3가 db로 설정된 상태에서

python manage.py dumpdata > datadump.json

바꾸고 난 후, 바로 직전 포스트에 올렸듯이, setting.py에서 mysql을 사용할 때의 설정을 바꾼다.

그리고 다음과 같은 명령어를 치면!

python manage.py loaddata datadump.json

다음과 같은 에러가 난다. utf-8 (인코딩) 관련 에러 같다.

_mysql_exceptions.OperationalError: (1366, "Incorrect string value: '\\xEC\\x9D\\xB4\\xED\\x85\\x8C...' for column 'host_name' at row 1")


찾아보니 json은 utf-8 인코딩이 안 된다하더라.
하지만 여기 관련 글이 죄다 너무 오래된 글들이어서(10년 전....) 믿을 수는 없지만, 일단 그러려니하고 dumpdata설정을 바꿔봤다.
(참고 사이트 : https://coderwall.com/p/mvsoyg/django-dumpdata-and-loaddata)
python manage.py dumpdata --format=xml > output.xml

음... 그래도 에러는 같더라.
(나중에 아래에서 이 에러가 해결됐을 때, json도 해결됐다.)
이리보고 저리봐도 mysql의 어떤 설정이 utf-8이 안 되어있는 것 같았다.
머리 싸매고 다시 검색해보니 여기서 힌트를 얻었다.

(위의 주소를 먼저 보고 아래를 찾았다)
http://nicesea.tistory.com/6
https://github.com/yungyikim/dev/blob/master/Python/Django/Mysql/setUtf8.md

아하! mysql은 기본적으로 한글세팅이 안되어 있으면 비슷한 에러가 나는구나.

하라는 대로 설정 바꾸고, 기존의 mysql database를 지우라고해서 지웠다. (저번 글에서 tutorial 따라가다보면 step 4에서 CREATE DATABASE를 한 부분이 있다.)

명령어는 DROP DATABASE (이름)

그러고 나서 다시  CREATE DATABASE하니 제대로 UTF-8을 받더라.

그 후에 loaddata를 다시하니 문제 하나 해결! 아까와 같은 에러는 안 생겼다. utf-8문제는 풀렸다.


대신 다른 에러가 생겼지롱~ 하핳ㅎ하핳하 역시 코딩은 디버깅이다.

django.db.utils.ProgrammingError: Problem installing fixture '/home/(name)/proj/mysite/output.xml': Could not load taxi.Recruit(pk=27): (1146, "Table 'taxi_data.taxi_recruit' doesn't exist")


찾아보니 1146 에러는 다른 사람들도 많이들 고민했던 문제 같다.

python manage.py migrate를 했냐고 묻는 질문에 좋아요가 많더라. 그러면 해결되나? 아니, 난 안 됨 ㅎ
(https://stackoverflow.com/questions/27583744/django-table-doesnt-exist)

아! mysql 리셋을 안 했네 ㅋㅋㅋㅋ (python manage.py sqlflush (db가 다 날아간다) / sudo systemctl restart mysql)

리셋하고 다시 python manage.py migrate 하니까 됨.


새로운 에러다. 이건 아까 어디선가 이런 에러가 난다고 본 기억이 있다.

django.db.utils.IntegrityError: Problem installing fixture '/home/(name)/proj/mysite/datadump.json': Could not load contenttypes.ContentType(pk=20): (1062, "Duplicate entry 'taxi-recruit' for key 'django_content_type_app_label_model_76bd3d3b_uniq'")


인테그리티 에러.


와... 이건 정말 옛날 것 밖에 없어서 하라는 대로 했는데 하나도 안 됐다. 그냥 이 방법을 포기하고 싶다. 다른 converter를 써볼까....

하는 와중에 색다른 에러가 나는 dumpdata 방법 발견!

(https://stackoverflow.com/questions/853796/problems-with-contenttypes-when-loading-a-fixture-in-django)

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

이렇게 하니까 loaddata를 실행하면,

django.db.utils.IntegrityError: Problem installing fixtures: The row in table 'taxi_profile' with primary key '9' has an invalid foreign key: taxi_profile.user_id contains a value '30' that does not have a corresponding value in auth_user.id.

이라는 에러가 등장한다. 뭔지는 잘 모르겠지만, 같은 integrity error지만, 뭔가 다르다. duplicate는 아니다.
하.... 오늘의 디버그는 여기까지... 하다 안 되면 내일 조력자의 도움을 받아볼까 한다....


댓글