본문 바로가기
개발자 전향 프로젝트

(파이썬 장고) CSV 를 Django를 이용해 DB에 집어넣기

by 샘오리 2023. 11. 19.

사용할 DB는 코끼리..가 아니라 PostgreSQL이다

 

이전글인

https://samori.tistory.com/80

 

(파이썬 장고) DB 테이블 CSV 로 출력하기

views.py에 아래 함수를 집어넣고 def 함수명(request): response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="파일명.csv"' writer = csv.writer(response) writer.writerow(['칼럼1','칼럼2',.

samori.tistory.com

과 반대로 오늘은 CSV를 DB에 입력하는 방법에 대해 알아보려고 한다. 

 

가장 쉽게 줄인 코드는 아래와 같다.

@transaction.atomic
def 함수명(request):

    CSV 변수1 = request.FILES.get("Input의 name")
    with transaction.atomic():
        try:
            dict_reader = DictReader(codecs.iterdecode(CSV 변수1, 'utf-8'))
            list_of_dict = list(dict_reader)

            model_instances = [모델명(
                칼럼1=record['칼럼1'],
                칼럼2=record['칼럼2'],
				...
                ...
            ) for record in list_of_dict]
            
            모델명.objects.bulk_create(model_instances)
            
            성공 처리
        except:
            예외 처리
    return 각자 알맞는 return방법

 

여기서 조금 헷갈릴 수 있는 것은 아래일텐데

CSV 변수1 = request.FILES.get("Input의 name")

 

보통 사용자가 화면에서 파일찾기 같은 버튼을 통해서 자신의 디렉토리에서 파일을 찾고 업로드하는데

이는 가장 기본적으로 HTML에서 input으로 구현할 수 있고

이 Input의 이름을 적으라는 것이다.

 

예를 들어 아래와 같은 input이다. 

<input id="ID명" type="file" name="이름" >

 

앞단에서 파이썬 소스로 어떻게든 전송을 했다면 저 input에 올린 파일이 같이 갔을텐데

파이썬 소스에서는 저 이름을 보고 csv를 읽고 읽은 내용을 Django 모델이 읽을 수 있게 변환한 뒤

입력해주는 것이다. 

 

여기서 쿼리를 여러번 날리는 것이 아니라 Bulk로 처리하는 것이 중요포인트!

모델명.objects.bulk_create(model_instances)

 

성공

 

응용을 하고 싶을 수 있다.

뭐 예를 들어 db에 있는 값이면 수정을 하고, 없는 값이면 입력을 하는 것.

 

편리성만 따진다면 알아서 넣어주니 좋고 risk를 본다면 데이터가 다 overwritten 되니 위험할 수 있다.

아무튼 

이 기능은 Python의 버전이 4.1보다 높으면 내장되어있는 기능이 있어 매우 쉽게 할 수 있고

4.1보다 낮으면 라이브러리를 다운받고 소스를 조금 수정해서 조금 번거로운데 두가지 방법 모두 다음에 다뤄보겠다.