장고 ORM 쓰세요~ 헛짓거리 하지말고!!
우선 저번 개발일지에 csv파일을 to_sql을 통해서 바로 업로드하는 방법을 적었었다. 그러나 처음에 테스트할 때는 잘 되던게 직접 우리 프로젝트 코드에 붙이고 작업을 하려고 하니까 계속 Foreign key mismatch ~ referencing ~ 에러가 났다.
그래 오늘의 개발일지는 내가 했던 뻘짓들의 기록이다.
import pandas as pd
from post.models import 모델클래스
from itertools import islice
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def handle(self, *args, **options):
batch_size = 100
columns = ['tag_title', 'tag_price','tag_image_url']
df = pd.read_csv('file path' names=columns, header=0)
objs = (모델클래스(
tag_title = row[0],
tag_image_url = row[2]
) for _, row in df.iterrows())
while True:
batch = list(islice(objs, batch_size))
if not batch:
break
모델클래스.objects.bulk_create(batch, batch_size)
기본적으로 python manage.py 명령어를 사용하기 위해서 management폴더에 commands 폴더에 해당 python 파일을 만들고 class Command로 감싸 handle함수를 사용하는 기본 골조는 같다.
그러나 배치사이즈를 지정해주고 csv를 dataframe으로 바꿔주고 iterrows()함수를 통해서 각 로우들을 불러와 0번째의 태그타이틀 값과 2번째의 url값들을 각각 모델클래스에 칼럼값으로 넣어주었다.
그리고 장고 docs를 참고하여 각 배치사이즈를 돌면서 배치사이즈만큼의 데이터를 저장하는 코드를 작성해보았다.
결론적으로 나를 괴롭히던 referencing 에러는 사라졌고 모델을 불러오는 것도 정상적으로 작동함을 확인했다.
새로운 시도를 통해서 많은 것을 배웠다.
1. 프레임워크를 다룰 때 프레임워크에서 권장하는 사안을 잘 지켜서 사용하자.
2. 새로운 시도를 할 때는 이 시도를 하는 이유를 분명히 하자(솔직히 겉멋 들어서 이터레이터 없이 한번에 올리고 싶었다.)
3. 이터레이션을 계속해서 돌면서 저장하는게 더 오래걸릴 거라고 생각했으나 bulk_create가 더 효율적이고 빠르게 데이터를 저장한다.
4. 현실은 항상 내 생각과는 다르다. 그러니 공부하자
참조 : https://stackoverflow.com/questions/66547188/foreign-key-mismatch-error-in-django-python
참조 : https://docs.djangoproject.com/en/4.0/ref/models/querysets/