프레임워크+라이브러리/Django
[MySQL, Django]csv 파일 DB에 밀어넣기 (bulk_create)
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

사실 이 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'))
]
결과



table에 정상적으로 입력 완료
