data를 다룰 때 보통 SQL을 사용한다. SQL(Structured Query Language)은 말그대로 구조화된 쿼리문인데, 관계형 database를 CRUD할 때 사용된다. MySQL도 SQL 언어이다.
django에는 객체의 관계를 연결해주는 ORM(Object/Realational/Mapper)기능이 있는데 ORM은 python을 database로 변환해주는 역할을 한다.
앞서말한 SQL 문이 없어도 database의 data를 객체 지향 방법을 통해 조금 더 편리하게 다룰 수 있다.
django의 models.py 에서 class를 만들어 테이블 객체를 만들고 이 객체에 여러 row의 data를 CRUD 할 수 있다.
예를 들어 User.objects.create(name = name)
과 같이 python에서 명령하면
name이라는 row가 생성된다.
이처럼 ORM은 파이썬에서 바로 빠르게 사용이 가능하여 생산적이다. SQL에서 직접적으로 하나씩 입력해야하는 것들을 빠르게 처리할 수 있고, 유지보수가 편리하다.
그러나 database에 대한 정확한 이해가 없으면 원리를 이해하기 쉽지 않고, 문제 대처능력이 떨어질 수 있다. 따라서 SQL 쿼리문은 꼭 배워두도록 하자.
CSV 파일은 mysql database에 dump하는데 ORM이야기를 한 이유는 ORM에 대한 개념이해와 models.py를 어떻게 사용하는지 알아야 dump도 가능하기 때문이다.
csv 파일은 (,)로 이루어진 row 표 형태로 이루어진 파일로서, 크롤링한 자료를 database로 한번에 옮길 수 있어 유용하다.
프로젝트를 진행하면서 크롤링한 파일들중 products 파일을 dump 한 코드는 다음과 같다.
import os
import django
import csv
import sys
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'logitech.settings')
django.setup()
from products.models import Product
CSV_PATH_PRODUCTS = './logitech_products.csv'
with open(CSV_PATH_PRODUCTS) as in_file:
data_reader = csv.reader(in_file)
next(data_reader, None)
for row in data_reader:
if row[0:10]:
product_banner = row[0]
product_teaser = row[1]
product_key_feature = row[2]
product_title = row[3]
product_details = row[4]
product_price = row[5]
product_note = row[6]
additional_feature = row[7]
specs_details = row[8]
recommended_products = row[9]
category = row[10]
Product.objects.create(
product_banner = product_banner.strip(),
product_teaser = product_teaser.strip(),
product_key_feature = product_key_feature.strip(),
product_title = product_title.strip(),
product_details = product_details.strip(),
product_price = product_price.strip(),
product_note = product_note.strip(),
additional_feature = additional_feature.strip(),
specs_details = specs_details.strip(),
recommended_products = recommended_products.strip(),
category_id = category.strip(),
)
크롤링한 logitech 상품 페이지 테이블은 총 10가지로, 각각의 상품 상세페이지에서 필요한 data들을 모았다. models.py에 있는 Pruduct 클래스를 import 하고 데이터를 열어 =, csv 파일 안에 있는 각각의 row를 객체화 시켜 Product 클래스에 연결이 되었고, Product 클래스는 mysql에 있는 products table로 해당 자료들을 옮겨주는 역할을 했다.
아직 크롤링이나 csv 파일 dump가 100% 이해가 되지는 않는다.
MySQL 쿼리셋문과 data에 대한 이해를 좀 더 높여 django ORM을 수월하게 쓰기까지 많은 연습이 필요하다.