csv파일 django model로 splite db에 저장하기

코변·2022년 6월 9일
1
post-thumbnail

장고야 너 너무 재밌다!!! 진심이야!!!!

앞서 5천장의 사진을 크롤링 해 이미지유사도까지 구했다. 그러나 사진과 함께 5천개의 추출한 데이터를 db에 저장해야 한다.

이제 다음 단계로 우리 모델에 이 파일로 저장된 데이터를 가져와야 하는데 구글링을 해보니 dataframe에는 to_sql이라는 함수를 제공한다고 한다.

내가 참고한 위의 페이지에서는 커넥션이 된 db를 아래와 같이 sql안에 table의 이름('products'라는 전제 하에)과 함께 넣어주어야 한다고 되어 있었다.

import sqlite3

conn = sqlite3.connect('test_database')

df.to_sql('products', conn, if_exists='replace',index =False)

출처 : https://datatofish.com/pandas-dataframe-to-sql/

저 방법도 좋지만 나는 django의 orm을 활용하여 저장하는 방법을 찾고 싶었고 최종 수단으로 사용하기 위해 북마크를 해두고 더 정보를 찾아 보았다.

그러던 중 스택오버플로우에서 django models에 명시한 class와 database의 url을 통해 얻어낸 engine을 connection 값으로 넣어주어 dataframe을 db 데이터로 바꾸는 코드를 발견했다.

from django.conf import settings

user = settings.DATABASES['default']['USER']
password = settings.DATABASES['default']['PASSWORD']
database_name = settings.DATABASES['default']['NAME']

database_url = 'postgresql://{user}:{password}@localhost:5432/{database_name}'.format(
    user=user,
    password=password,
    database_name=database_name,
)

engine = create_engine(database_url, echo=False)
df.to_sql(HistoricalPrices, con=engine)

출처 : https://stackoverflow.com/questions/37688054/saving-a-pandas-dataframe-to-a-django-model

위와 같은 코드인데 도대체 engine은 무엇이며 저 create_engine은 어디에서 온 것인가? 코드를 따라쳐보던 중 의문이 들어 다시 페이지로 돌아가서 답변 밑에 달린 글들을 보니 SQLAlachemy engine이라고 누군가가 알려준 답변을 찾았다.

import pandas as pd
from db_test.models import '모델명'
from sqlalchemy import create_engine

columns = ['id', 'tag_title', 'tag_price','tag_image_url']
df = pd.read_csv('csv경로', names=columns, header=0)
engine = create_engine('sqlite:////{sqlite 절대경로}')
df.to_sql('모델명'._meta.db_table, if_exists='replace' ,con=engine, index=False)

이를 토대로 코드를 작성했고 새롭게 앱을 만들어 실행을 했는데 실행이 안된다. db_test를 찾을 수가 없다고 에러 메시지를 뱉는다. 그래서 또 열심히 왜 안 되는지 찾아본 결과

https://www.youtube.com/watch?v=NMsAKQI9Cbc

위 유튜브영상과 django documentation에서 답을 찾을 수 있었다. 완전히 답이 해소된 건 아니지만 이 다음 공부는 다시 한 번 살펴보려고 한다. 어쨌든 내가 내린 결론은 내가 만든 파이썬 함수를 command 명령어처럼 실행하려면 management폴더 아래에 commands라는 폴더를 만들고 그 아래에 파이썬 파일을 만들어 python manage.py 파이썬파일명을 입력하면 된다는 것이다.

import pandas as pd
from sqlalchemy import create_engine
from django.core.management.base import BaseCommand
from db_test.models import '모델명'

class Command(BaseCommand):
    def handle(self, *args, **options):
        columns = ['id', 'tag_title', 'tag_price','tag_image_url']
        df = pd.read_csv('/Users/jujeonghan/Developer/did_it_walk/db_test/static/csv/shoes.csv', names=columns, header=0)

        engine = create_engine('sqlite://///Users/jujeonghan/Developer/did_it_walk/db.sqlite3')
        df.to_sql('모델명'._meta.db_table, if_exists='replace' ,con=engine, index=False)

여러 답변들을 종합한 내 코드다.

위와 같이 class Command(BaseCommand):
라는 클래스를 선언해서 handle함수를 넣어주고 터미널에 python manage.py add_db-> 내가만든 파일명을 입력하면 아무 반응이 없다. 어떤 강사님이 그랬는데 터미널이 조용하면 그건 내 코드가 작동한거라고 ㅎㅎㅎ 제대로 작동했고 db에 저장이 잘 된 것까지 확인했다. 우여곡절이 많았지만 오늘 하루도 재밌게 코딩했다.

=================================================

와 빅에러를 만들어 내놓고도 신나게 웃고 있구나 과거의 나야 너가 잘한건 새로운 시도를 하려고 했다는 거 밖에 없다. 혹시나 이 글을 통해 나같은 고통을 겪으실지도 모르는 분을 위해 이 링크를 남긴다.

https://velog.io/@aboutjoo/bulkcreate%EA%B0%80-%EC%9E%88%EB%8A%94%EB%8D%B0-%EC%99%9C-%EA%B7%B8%EB%9E%AC%EC%9D%84%EA%B9%8C

profile
내 것인 줄 알았으나 받은 모든 것이 선물이었다.

0개의 댓글