django에 PostgreSQL 연동 - (2)

0v0baek·2023년 6월 9일
0

TIP

목록 보기
8/15
post-custom-banner

도움 받은 글

Django PostgreSQL Migration from SQLite

들어가며

✅ PostgreSQL 설치
👉 크롤링 한 데이터 백업하기 (dump data)
⬜ PostgreSQL 프로젝트에 연결
⬜ 크롤링 한 데이터 적용시키기 (load data)

Windows 환경 기준으로 작성했다.

3. sqlite에 저장된 데이터 백업

기존 프로젝트를 하면서 저장해 둔 로컬 DB의 데이터가 꽤 있어서
(크롤링 하는데 꽤 걸림)
다시 DB를 연결하기 보다는 데이터를 dump하는 쪽이 낫겠다고 선택했다.

🔎 특정 DB의 데이터를 json 값으로 내보내기

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 openencoding 속성을 utf-8로 주어 한글이 깨지지 않게 한 뒤, data.json 파일에 실어보낸다.

아주 잘 담겨 나온다!
dump 성공.

profile
개발 공부 하는 비전공자 새내기. 꾸준히 합시다!
post-custom-banner

0개의 댓글