슈코딩
[SQL] json 파일 MySQL DB에 저장하기 feat.Django 본문
#문제
추천시스템 프로젝트를 진행하던 중 크롤링을 통해 데이터를 수집해서 csv 파일로 만들었었다.
이제 데이터는 수집을 하였는데, 정작 이것을 DB에 넣어야하는데 그 방법을 몰라서 당황을 했다.
1. csv to json
우선은 장고의 loaddata라는것을 활용해서 데이터를 넣기위해 csv파일을 json파일로 변형을 시켰다.
위 사이트에서 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/
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에 잘 저장을 해준다.
'개발일지 > Issues' 카테고리의 다른 글
[Django] HTTP error code 401, 403, 404, 405, 415, 500 (0) | 2022.07.25 |
---|---|
[AWS] Django 프로젝트 배포 feat. Gunicorn, Nginx (0) | 2022.06.13 |
[MySQL] 장고 프로젝트 DB연결 (0) | 2022.06.10 |
[정규 표현식] 회원가입 기능 (0) | 2022.05.25 |
[Git hub] The requested URL returned error: 403 (0) | 2022.05.23 |