How to put Data by using CSV + ERROR

김기현·2022년 3월 2일
0
post-thumbnail

데이터를 DB에 넣을 때 하드코딩으로 넣을 수 있는 방법도 좋지만 귀찮기에... 아주 많이 귀찮기에 다른 방법을 찾곤 합니다. 그 방법 중 하나가 파이썬 파일을 CSV파일과 연동해 자동으로 넣도록 하는 방법인데요! 이번 블로깅에서는 해당 방법을 진행하면서 어떤 에러를 만났는지, 어떻게 해결했는지 알아보겠습니다.

CSV 작성하기

csv는 필드를 쉼표(,)로 구분한 텍스트 데이터 및 텍스트 파일입니다. 사진처럼 보기 좋게 하기위해 엑셀이라는 도구를 통해 시각적으로 보여질 뿐 필드는 ,로 구분되어 있습니다.

해당 예시의 csv파일은 다음과 같습니다.
이렇게 작성된 CSV파일을 가지고 어떻게 넣냐...! 파이썬 파일을 작성해 csv row값들을 하나씩 넣는 방법을 사용하는데요! 다음의 과정과 같습니다.
공식 문서에도 자세하게 나와있습니다!!

python 파일 만들기

  • reader()
    공식설명 : 지정된 csvfile의 줄을 이터레이트 하는 판독기(reader) 객체를 반환합니다.
    요약 : 해당 row의 번호로 값을 넣는다.
import os, django, csv 	# os, django, csv를 사용하기 위함

from pathlib import Path	# 경로를 객체로써 조작, 처리합니다.

BASE_DIR = Path(__file__).resolve().parent.parent
print(BASE_DIR)
# Path(__file__)은 현재 파일의 구상 경로를 인스턴스화하고 resolve() 메서드를 통해 절대경로를 반환
# 부모 경로로 2번 옮겨가면 django 프로젝트가 생성된 위치가 BASE_DIR 변수로 인스턴스화 된 것을 의미

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
# 프로젝트에 등록되어있지 않은 파일에서 장고 사용
django.setup()
# 장고 셋업

from products.models import Product		# class 임포트
CSV_PATH_USERS = '2.csv'				# 파일 경로 지정

with open(CSV_PATH_USERS) as in_file:	# csv 파일 오픈
    data_reader = csv.reader(in_file)	# reader로 지정해 시퀀스 읽기, reader객체 반환
    next(data_reader, None)				# 첫줄 띄우기(필드값)
    for row in data_reader:
        Product.objects.create(
            name = row[0], 				# 필드의 0번 row값 넣기
            description = row[1],		# 필드의 1번 row값 넣기
            thumbnail = row[2],			# 필드의 2번 row값 넣기
        )
  • DictReader()
    공식설명 : 각 행(row)의 정보를 키가 선택적 fieldnames 매개 변수로 지정된 dict로 매핑하는 객체를 만든다....
    요약 : 키값을 가지고 매핑한다.
with open(CSV_PATH_USERS) as in_file:	# csv 파일 오픈
    data_reader = csv.DictReader(in_file)	# reader로 지정해 시퀀스 읽기, DictReader객체 반환
    for row in data_reader:
        Product.objects.create(
            name = row["name"], 				# 필드의 0번 row값 넣기
            description = row["description"],	# 필드의 1번 row값 넣기
            thumbnail = row["thumbnail"],		# 필드의 2번 row값 넣기
        )

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings") 를 해주지 않으면 다음과 같은 에러가 나오더군요..!


Lovely Error

작업을 하다가 만난 사랑스러운 에러가 있었으니...

TypeError : Direct assignment to the forward side of a many-tomany set is prohibited. use sizes.set() instead.

many-to-many방향쪽으로 직접 할당하는게 금지되어있다....!

모델링에는 분명히 sizes라는 필드가 있는데...
그래서 many_to_many 필드로 작업하신 분의 블로그도 보았지만 실패했다....
sizes는 안넣어지는겨....왜일까....




그래서 sql테이블 조회를 해보니 size라는 필드값이 없다.

중간 테이블을 넣어주어서 그런것일까...?(Product <=> ProductSize <=> Size)

아무튼 빼고 넣으니 잘 넣어졌고 에러 없이 중간테이블과 Size 테이블까지 값을 넣는데 문제가 없었다....

이것 저것 해보다가 해당 에러도 있었는데..... 왜 나온것일까....

다음의 에러는 다음의 과정으로 해결합니다.파일 상단에 다음을 입력합니다.

#-*-coding: utf-8-*-
#-*-coding: euc-kr-*-
profile
피자, 코드, 커피를 사랑하는 피코커

0개의 댓글