상세 컨텐츠

본문 제목

[MySQL, Django]csv 파일 DB에 밀어넣기 (bulk_create)

프레임워크+라이브러리/Django

by moonionn 2021. 3. 29. 15:37

본문

위코드 2주차에는 

스타벅스 메뉴와 상품들에 대한 정보를 Django를 통해

MySQL DB에 저장하는 과정에 대해 배웁니다. 

 

안내되어 있기로는 python shell을 사용하라고 되어 있긴 한데...

하나하나 넣기에는 너무 귀찮아서ㅎㅎ

 

그냥 서버 request 받으면 한번에 처리되도록 로직을 작성하였습니다.

(그리고 찾아보니 저처럼 csv 파일 사용하시는 분들이 몇 계시더군요)

 

 

1. 상품 영양 성분을 저장한 모델

(my_project/products/models.py 중 Nutrition class)

class Nutrition(models.Model):
    one_serving_kcal    = models.DecimalField(max_digits=6, decimal_places=2)
    sodium_mg           = models.DecimalField(max_digits=6, decimal_places=2)
    fat_g               = models.DecimalField(max_digits=6, decimal_places=2)
    sugars_g            = models.DecimalField(max_digits=6, decimal_places=2)
    protein_g           = models.DecimalField(max_digits=6, decimal_places=2)
    caffeine_mg         = models.DecimalField(max_digits=6, decimal_places=2)

    class Meta:
        db_table = 'nutritions'

 

 

2. 각 column의 순서대로의 정보가 담긴 csv파일

140, 1, 2, 10, 8, 200
80, 0, 0, 11, 0, 240
235, 3, 10, 8, 4, 185
480, 8, 14, 18, 5, 220
100, 1, 2, 0, 0, 180
300, 5, 5, 10, 5, 230

vs code의 rainbow csv 플러그인 추천

사실 이 csv 파일 작성하는 것도 귀찮았습니다.

좀 더 실력이 좋아지면 웹 크롤링으로 데이터를 긁어올 수 있겠죠..?

 

 

1. 로직 작성

my_project/products/views.py 내용

1-1. import 한 목록

# views.py의 import 목록

import csv

from django.shortcuts import render
from django.http import HttpResponse

# db 모델들.. 여기서는 Nutrition만 쓸 예정
from .models import Menu, Category, Drink, Nutrition, Allergy, Image

 

1-2. csv 파일 열고 해당 데이터를 변수에 저장하는 함수

data = None
file_dir = 'my_csv_file_directory'

def read_data(table_name):
    with open(file_dir + f'{table_name}.csv', 'r') as csvfile:
        reader = csv.reader(csvfile)
        global data
        data = list(reader)
    return

 

1-3. 읽은 데이터 DB에 저장하고 csv 파일 내용 초기화 하는 함수

1-2 와 1-3에서 중요한 점: 한 번 연 파일은 꼭 다시 닫아야!

def footer(table_name, class_name, bulk_list):
    class_name.objects.bulk_create(bulk_list)
    
    with open(file_dir + f'{table_name}.csv', 'w') as csvfile:
        writer = csv.writer(csvfile)
    return

 

1-4. 1-2와 1-3을 사용해서 request 받았을 때 실행할 함수

def add_nutritions(request):
    read_data('nutritions')
    if not data:
        return HttpResponse('Nothing to update')

    arr = []
    for row in data:
        arr.append(Nutrition(
            one_serving_kcal=row[0],
            sodium_mg=row[1],
            fat_g=row[2],
            sugars_g=row[3],
            protein_g=row[4],
            caffeine_mg=row[5]
        ))

    footer('nutritions', Nutrition, arr)
    return HttpResponse('Nutritions table updated')

 

1-5. 로직 실행할 url 설정

my_project/products/urls.py 내용

from django.urls import path
from .views import add_nutritions

urlpatterns = [
    path('nutritions/', add_nutritions)
]

 

1-6. 해당 app의 url을 lookup하는 url 설정

my_project/my_project/urls.py 내용

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('products/', include('products.urls'))
]

 

결과

로직 이상 무!

 

nutritions.csv 파일 초기화 정상 작동

 

table에 정상적으로 입력 완료

관련글 더보기

댓글 영역