슈코딩

[SQL] json 파일 MySQL DB에 저장하기 feat.Django 본문

개발일지/Issues

[SQL] json 파일 MySQL DB에 저장하기 feat.Django

Roshu 2022. 6. 16. 00:36

 

 

#문제

추천시스템 프로젝트를 진행하던 중 크롤링을 통해 데이터를 수집해서 csv 파일로 만들었었다. 

이제 데이터는 수집을 하였는데, 정작 이것을 DB에 넣어야하는데 그 방법을 몰라서 당황을 했다. 

 

1. csv to json

우선은 장고의 loaddata라는것을 활용해서 데이터를 넣기위해 csv파일을 json파일로 변형을 시켰다.

https://csvjson.com/csv2json

 

CSV to JSON - CSVJSON

Embed all the functionality of csvjson in any web application with Flatfile. Auto-match columns, validate data fields, and provide an intuitive CSV import experience.

csvjson.com

 

위 사이트에서 csv파일을 컨버트하면 json파일로 자동으로 변형시켜주는 편리한 사이트이다. 

 

2. 장고 공식문서, 초기데이터 제공 방식

 

장고에서 loaddata를 하기위해서는 json 데이터의 기본 형식이 있다. 

[
  {
    "model": "myapp.person",
    "pk": 1,
    "fields": {
      "first_name": "John",
      "last_name": "Lennon"
    }
  },
  {
    "model": "myapp.person",
    "pk": 2,
    "fields": {
      "first_name": "Paul",
      "last_name": "McCartney"
    }
  }
]

공식문서를 확인해보면 이렇게 Person 모델을 기준으로 json파일의 내용이 이러한 형태로 이루어져야 

dumpdata, loaddata를 통해 DB에 저장을 할 수 있다. 반대로 DB에있는 데이터들을 dumpdata 하게되면 위 형식의

json파일로 만들 수 있다는것을 공식문서를 통해 확인 할 수 있었다.

https://docs.djangoproject.com/en/4.0/howto/initial-data/

 

How to provide initial data for models | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

3. 가지고 있는 json 파일 Django 형식으로 바꿔주기 

genre_loader.py

import json

genre_list = ['sf', '가족', '공포', '드라마', '로맨스', '먼치킨', '모험', '미스테리', '범죄', '서스펜스', '스포츠', '시대', '옴니버스', '요괴', '이세계', '일상', '전투', '코미디', '판타지', '학원']


new_list = []
for genre in genre_list:
    new_data = {"model": "animation.genre"}
    new_data["fields"] = {}
    new_data["fields"]["name"] = genre
    new_list.append(new_data)


with open('genre_data.json', 'w', encoding='UTF-8') as f:
    json.dump(new_list, f, ensure_ascii=False, indent=2)

이렇게 코드를 짜고 실행을하면 genre_list 를 genre_data.json이라는 파일로 변형을 시킬 수 있다.

 

animation_loader.py 

import json

genre_list = ['SF', '가족', '공포', '드라마', '로맨스', '먼치킨', '모험', '미스테리', '범죄', '서스펜스', '스포츠', '시대', '옴니버스', '요괴', '이세계', '일상', '전투', '코미디', '판타지', '학원']


with open('animation.json', 'r', encoding='UTF8') as f:
  animations = json.load(f)

# Output: {'name': 'Bob', 'languages': ['English', 'French']}


new_list = []
for animation in animations:
    new_data = {"model": "animation.animation"}
    if animation["genre"]:
      genres = eval(animation["genre"]) #eval = 스트링안의 리스트를 리스트로 변형
      genre_int_list = []
      for genre in genres:
        genre_int = genre_list.index(genre) + 1  #장르리스트의 genre index번호에 +1 을해서 pk값과 동일값 구하기
        genre_int_list.append(genre_int)
      animation['genre'] = genre_int_list

    else:
      animation["genre"] = []
    new_data["fields"] = animation
    new_list.append(new_data)


with open('animations_data.json', 'w', encoding='UTF-8') as f:
    json.dump(new_list, f, ensure_ascii=False, indent=2)

 

마찬가지로 csv to json 사이트에서 변형시킨 json파일도 위코드를 실행시키면 

장고에서 loaddata 할 수 있는 형태로 json파일이 바뀌어서 새로 저장이되게 된다. 

 

4. loaddata

이제 생성된 json 파일명과 경로만 확인한뒤, manage.py가있는 디렉토리일경우 

python manage.py loaddata xxx.json 을 터미널에서 실행시키면 

장고가 json파일을 알아서 DB에 잘 저장을 해준다. 

 

Comments