"uploader.py code 전문"
import os, django, csv, sys
from products.models import *
# system setup
os.chdir('.')
print('Current dir의 경로 : ', end=''), print(os.getcwd())
# os가 파악한 현재 경로를 표기
print('os.path.abspath(__file__)의 경로 : ',os.path.abspath(__file__))
# 현재 작업중인 파일을 포함 경로를 구체적으로 표기
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
print('BASE_DIR=', end=''), print(BASE_DIR)
print('똑같나? 다르나?', BASE_DIR == os.getcwd())
sys.path.append(BASE_DIR)
# sys 모듈은 파이썬을 설치할 때 함께 설치되는 라이브러리 모듈이다.
# 이 sys 모듈을 사용하면 파이썬 라이브러리가 설치되어 있는 디렉터리를 확인할 수 있다.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", 'brokurly.settings')
# python이 실행될 때 DJANGO_SETTINGS_MODULE라는 환경 변수에 현재 프로젝트의
settings.py 파일 경로를 등록
django.setup()
# python manage.py shell 을 실행하는 것이랑 비슷한 방법이다.
즉, 파이썬 파일에서도 django를 실행 시킬수 있다.
menu = './menus.csv'
category = './categories.csv'
product = './products.csv'
image = './images.csv'
# insert data while reading csv file into table
# open csv file and insert row data in MySQL
# Menu Table
def insert_menu():
with open(menu, newline='', encoding='utf8') as csvfile:
data_reader = csv.DictReader(csvfile)
for row in data_reader:
menu_id = Menu.objects.create(
name = row['menu'] )
print('MENU DATA UPLOADED SUCCESSFULY!')
def insert_category():
with open(category, newline='', encoding='utf8') as csvfile:
data_reader = csv.DictReader(csvfile)
for row in data_reader:
menu_id = Menu.objects.get(name=row['menu'])
Category.objects.create( name = row['category'],menu = menu_id)
print('CATEGORY DATA UPLOADED SUCCESSFULY!')
def insert_products():
with open(product, newline='', encoding='utf8') as csvfile:
data_reader = csv.DictReader(csvfile)
for row in data_reader:
category_id = Category.objects.get(name=row['category'])
Product.objects.create(
name = row['name'],
price = row['price'],
introduction = row['introduction'],
description = row['description'],
unit = row['unit'],
shipping = row['shipping'],
package = row['package'],
origin = row['origin'],
weight = row['weight'],
stock = row['stock'],
category = category_id
)
print('PRODUCT DATA UPLOADED SUCCESSFULY!')
def insert_image():
with open(image, newline='', encoding='utf8') as csvfile:
data_reader = csv.DictReader(csvfile)
for row in data_reader:
print(row)
product_id = Product.objects.filter(name=row['name'])
Image.objects.create(url = row['url'],product = product_id[0])
print('CATEGORY DATA UPLOADED SUCCESSFULY!')
insert_menu()
insert_category()
insert_products()
insert_image()
-> 대략 11번정도 DB를 엎었던 것 같다.
-> 중간에 image 테이블을 만들지 않았다는 것을 깨달았고, models.py를 다시 작성하여 git push 후 merge를 받는 등 여러 해프닝이 있었지만, 결과적으로 더미 데이터가 잘 입력되었다.
-> 물론, 맨땅에 코드를 작성할 수 없었기에 구글신의 도움을 받아 가져온 뒤, 3명이서 머리를 맞대고 하루종일, 한줄 한줄 코드 해부쇼를 펼치기도 했다.
-> 요약하자면, 엑셀파일에 대량의 데이터를 입력해서 csv 포맷으로 저장한 뒤, 파이썬에서 업로드 목적으로 만든 코드를 이용해, DB에 일괄 입력하는 것이다.
-> 대량의 코드가 한꺼번에 입력되기 때문에 엑셀에 타이포가 생기지 않게 조심해야하며, 업로드용 코드를 작성할 때에도 일치하는 테이블과 필드에 정확히 위치하는지도 잘 살펴야 한다.
-> 상위 테이블을 정참조하고 있는 테이블은 코드 구성에 해당 테이블을 연결해줘야 함을 잊지 않아야 DB를 엎는 사태가 벌어지지 않는다.