Django PostgreSQL Migration from SQLite
✅ PostgreSQL 설치
👉 크롤링 한 데이터 백업하기 (dump data)
⬜ PostgreSQL 프로젝트에 연결
⬜ 크롤링 한 데이터 적용시키기 (load data)
Windows
환경 기준으로 작성했다.
기존 프로젝트를 하면서 저장해 둔 로컬 DB의 데이터가 꽤 있어서
(크롤링 하는데 꽤 걸림)
다시 DB를 연결하기 보다는 데이터를 dump
하는 쪽이 낫겠다고 선택했다.
python manage.py dumpdata 앱 이름 > data.json
이렇게 하면 특정 앱의 데이터베이스만 백업할 수 있다.
CommandError: Unable to serialize database: 'cp949' codec can't encode character '\u8671' in position 7: illegal multibyte sequence
Exception ignored in: <generator object cursor_iter at 0x00000200ABE139E0>
Traceback (most recent call last):
File "F:\nbc\final_project\han\.venv\lib\site-packages\django\db\models\sql\compiler.py", line 2096, in cursor_iter
cursor.close()
sqlite3.ProgrammingError: Cannot operate on a closed database.
그런데, DB를 백업하다보면 이런 오류를 마주하기도 한다.
이른바 인코딩 문제인데,
해결하기 위해선 데이터를 직렬화 할 때 인코딩 해주어야 한다.
우선 crawler.py
가 위치한 곳에 같이 dump.py
를 생성해주자.
# dump.py
import json
import os
from dotenv import load_dotenv
# dotenv에서 key값을 참조하기 때문에 dotenv를 load 해와야 함
dotenv_path = os.path.join(os.path.dirname(__file__), ".env")
load_dotenv(dotenv_path)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
import django
django.setup()
from django.core import serializers
from crawled_data.models import WordQuiz, WordQuizOption
# json 파일에 담아 줄 모델 가져오기
quiz_data = WordQuiz.objects.all()
option_data = WordQuizOption.objects.all()
# 모델을 담을 리스트 생성
serialized_data = []
# WordQuiz를 시리얼라이저로 직렬화 후 data에 추가
serialized_quiz = serializers.serialize("json", quiz_data)
serialized_data.extend(json.loads(serialized_quiz))
# WordQuizOption을 시리얼라이저로 직렬화 후 data에 추가
serialized_option = serializers.serialize("json", option_data)
serialized_data.extend(json.loads(serialized_option))
# 한글이 꺠지지 않게 인코딩 설정, data.json으로 내보내기
with open("data.json", "w", encoding="utf-8") as file:
json.dump(serialized_data, file, ensure_ascii=False)
crawler.py
와 마찬가지로, django
내부의 모델을 끌어와주기 위해서는
맨 윗줄에 django
환경을 임의로 세팅해주는 코드의 추가가 필요하다.
그 뒤 django
모듈인 serializers
로 데이터를 직렬화 해준다.
마지막으로, with open
에 encoding
속성을 utf-8
로 주어 한글이 깨지지 않게 한 뒤, data.json
파일에 실어보낸다.
아주 잘 담겨 나온다!
dump
성공.