TIL-039 | 꾸며줘 홈즈 project(3)_CSV를 활용한 data upload

Lee, Chankyu·2021년 11월 14일
0
post-thumbnail
post-custom-banner

CSV(Comma-Separated Values)

📝 CSV 란?

  • 몇 가지 필드를 쉼표(,)로 구분한 텍스트 데이터 및 텍스트 파일이다.
  • .csv 파일 생성을 통해 작성하면 된다.
  • 엑셀, numbers 등의 파일로 작성 후 csv로 내보내기를 통해 파일을 형성 할 수도 있다.
  • CSV 파일은 데이터의 크기가 작기때문에 JSON 데이터의 비해 절반 이하의 용량을 사용한다는 장점이 있다.
  • 쉼표(,) 대신 다른 문자를 구분점으로 사용할 수 있다. 대신 uploader 파일에서 설정해주어야 한다.

📝 CSV 파일의 생성

  • .csv 확장자로 파일을 생성하여 작성하면 된다.
  • default로 콤마(,)를 사용하여 구분하되 띄어쓰기가 들어가면 안된다. 콤마(,)는 셀의 구분을 의미한다.

👉 예시

group_name,displayed_price,discount_rate,company,sub_category_id,delivery_id
캐더린 통수납 침대,599000,68,리샘가구,1,1
다락 빅 수납침대,650000,63,포덕홈,1,1
헤르만 무헤드 통수납 침대,309000,69,리샘가구,1,1
단잠슬림가드 저상형 패밀리 침대,798000,79,모던바로크,1,1
산타페 하이브리드 침대,189000,20,지누스,1,1
레아 사계절 고무나무 원목침대,399000,53,퍼니코,1,1

uploader.py를 이용한 CSV파일의 활용

👉 import & 환경변수 설정

import os, django, csv, sys

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "homes.settings")
django.setup()
  • 위와 같이 환경변수에 Django 세팅을 한 뒤, django.setup을 호출한다.

👉 CSV 파일 경로 설정 & 모델 import

from products.models import *

CSV_PATH_MENU         = 'csv/Menu.csv'
CSV_PATH_CATEGORY     = 'csv/Category.csv'
CSV_PATH_SUBCATEGORY  = 'csv/SubCategory.csv'
CSV_PATH_PRODUCTGROUP = 'csv/ProductGroup.csv'
CSV_PATH_PRODUCT      = 'csv/Product.csv'
CSV_PATH_COLOR        = 'csv/Color.csv'
CSV_PATH_PRODUCTIMAGE = 'csv/ProductImage.csv'
CSV_PATH_REVIEW       = 'csv/Review.csv'
CSV_PATH_DELIVERY     = 'csv/Delivery.csv'
CSV_PATH_PRODUCTCOLOR = 'csv/ProductColor.csv'
  • 모델의 import는 반드시 django 환경설정 밑에 작성하도록 한다. 그렇지 않으면 모델을 불러올 수 없는 에러가 발생한다.

👉 작성한 db_uploader.py

import os, django, csv, sys

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "homes.settings")
django.setup()

from products.models import *

CSV_PATH_MENU         = 'csv/Menu.csv'
CSV_PATH_CATEGORY     = 'csv/Category.csv'
CSV_PATH_SUBCATEGORY  = 'csv/SubCategory.csv'
CSV_PATH_PRODUCTGROUP = 'csv/ProductGroup.csv'
CSV_PATH_PRODUCT      = 'csv/Product.csv'
CSV_PATH_COLOR        = 'csv/Color.csv'
CSV_PATH_PRODUCTIMAGE = 'csv/ProductImage.csv'
CSV_PATH_REVIEW       = 'csv/Review.csv'
CSV_PATH_DELIVERY     = 'csv/Delivery.csv'
CSV_PATH_PRODUCTCOLOR = 'csv/ProductColor.csv'

with open(CSV_PATH_MENU) as in_file:
    data_reader = csv.reader(in_file)
    next(data_reader, None)

    for row in data_reader:
        if row[0]:
            name      = row[0]
            image_url = row[1]
            Menu.objects.create(name = name, image_url = image_url)

with open(CSV_PATH_CATEGORY) as in_file:
    data_reader = csv.reader(in_file)
    next(data_reader, None)

    for row in data_reader:
        if row[0]:
            name    = row[0]
            menu_id = row[1]
            Category.objects.create(name = name, menu_id = menu_id)

with open(CSV_PATH_SUBCATEGORY) as in_file:
    data_reader = csv.reader(in_file)
    next(data_reader, None)

    for row in data_reader:
        if row[0]:
            name        = row[0]
            category_id = row[1]
            SubCategory.objects.create(name = name, category_id = category_id)

with open(CSV_PATH_DELIVERY) as in_file:
    data_reader = csv.reader(in_file)
    next(data_reader, None)
    for row in data_reader:
        delivery_type = row[0]
        payment_type  = row[1]
        delivery_fee  = row[2]
        Delivery.objects.create(delivery_type = delivery_type, payment_type = payment_type, delivery_fee = delivery_fee)

with open(CSV_PATH_PRODUCTGROUP) as in_file:
    data_reader = csv.reader(in_file)
    next(data_reader, None)
    for row in data_reader:
        name            = row[0]
        company         = row[3]
        displayed_price = row[1]
        discount_rate   = row[2]
        sub_category    = row[4]
        delivery        = row[5]
        ProductGroup.objects.create(name = name, company = company, displayed_price = displayed_price, discount_rate = discount_rate, sub_category_id = sub_category, delivery_id = delivery)

with open(CSV_PATH_PRODUCT) as in_file:
    data_reader = csv.reader(in_file)
    next(data_reader, None)
    for row in data_reader:
        name          = row[0]
        price         = row[1]
        product_group = row[2]
        Product.objects.create(name = name, price = price, product_group_id = product_group)

with open(CSV_PATH_COLOR) as in_file:
    data_reader = csv.reader(in_file)
    next(data_reader, None)
    for row in data_reader:
        name = row[0]
        Color.objects.create(name = name)

with open(CSV_PATH_PRODUCTIMAGE) as in_file:
    data_reader = csv.reader(in_file)
    next(data_reader, None)
    for row in data_reader:
        image_url     = row[0]
        product_group = row[1]
        ProductImage.objects.create(image_url = image_url, product_group_id = product_group)

with open(CSV_PATH_REVIEW) as in_file:
    data_reader = csv.reader(in_file)
    next(data_reader, None)
    for row in data_reader:
        user          = row[0]
        content       = row[1]
        star_rate     = row[2]
        product_group = row[3]
        Review.objects.create(user_id = user, content = content, star_rate = star_rate, product_group_id = product_group)

with open(CSV_PATH_PRODUCTCOLOR) as in_file:
    data_reader = csv.reader(in_file)
    next(data_reader, None)
    for row in data_reader:
        product = row[0]
        color   = row[1]
        ProductColor.objects.create(product_id = product, color_id = color)
  • next() 함수는 첫번째 row의 column명을 무시하기 위해 사용된다. - for문을 통해 field값에 csv의 data를 매칭 시켜준다.
  • 입력한 필드가 다른 테이블의 id값을 참조하고 있을 경우 "필드명_id"를 필드값으로 사용한다.
profile
Backend Developer - "Growth itself contains the germ of happiness"
post-custom-banner

0개의 댓글