본문 바로가기
플랫폼엘 정리or해석

엑셀에 있는 데이터를 PANDAS 이용해서 DB에 저장

by shulk 2024. 8. 5.

 

일단 엑셀의 구조는 이렇게 있고,각인덱스 데이터마다 스페이스,매체,프로그램에 해당하는 태그들을 TB_EXHIT_TAG 테이블에 

[ 플랫폼 라이브 인덱스  10 , 중정 인덱스 12 , 다원예술 인덱스 13] 일경우 밑에처럼 이렇게 삽입한다.

905 / 10 / 현재시간

905/ 12 / 현재시간

905/ 13 / 현재시간   

 

import pandas as pd
import mysql.connector

# MySQL 데이터베이스 연결 설정
db_config = {
    'user': '계정이름',
    'password': '비번',
    'host': '호스트',
    'port': 포트번호,
    'database': 'DB이름'
}

# MySQL 연결
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()

# 엑셀 파일 경로
file_path = '/Users/seok/Downloads/아카이브 리스트 - 태그 정리.xlsx'

# 엑셀 파일 읽기
df = pd.read_excel(file_path, header=2)

tag_dic = {
    '갤러리': 10, '아넥스': 11, '렉쳐룸': 12, '머신룸': 13, '플랫폼 라이브': 14, '스토어': 15, '중정': 16,
    '다원예술': 17, '뉴미디어': 18, '패션': 19, '건축': 20, '사진': 21, '디자인': 22, '공예': 23, '회화': 24,
    '드로잉': 25, '판화': 26, '조각/ 설치': 27, '전시': 28, '공연': 29, '클래스': 30, '포럼': 31, '이벤트': 32
}
result=0

# DB에 저장할 함수 예시
def insert_into_db(exhibit_idx, tag_list, db_cursor):
    global result
    if tag_list is not None:
        for tag in tag_list:
            tag_idx = tag_dic[tag]
            query = "INSERT INTO PRACTICE (EXHIBIT_CONTENTS_IDX, TAG_IDX,REG_DTTM) VALUES (%s, %s,NOW())"
            db_cursor.execute(query, (exhibit_idx, tag_idx))
            result +=1
    else:
        for tag_idx in tag_dic.values():
            query = "INSERT INTO PRACTICE (EXHIBIT_CONTENTS_IDX, TAG_IDX,REG_DTTM) VALUES (%s, %s,NOW())"
            db_cursor.execute(query, (exhibit_idx, tag_idx))
            result +=1

# 각 행을 처리
for index, row in df.iterrows():
    idx = row['idx']
    check = 0
    if idx not in (887,384,375,372,368,215,214,127,84,83):
        # 스페이스
        spaces = [row[i] for i in range(3, 8) if pd.notna(row[i])]
        if spaces is not None:
            insert_into_db(idx, spaces, cursor)
            check += len(spaces)

        # 매체
        media = [row[i] for i in range(8, 14) if pd.notna(row[i])]
        if media is not None:
            insert_into_db(idx, media, cursor)
            check += len(media)

        # 프로그램
        programs = [row[i] for i in range(14, 19) if pd.notna(row[i])]
        if programs is not None:
            insert_into_db(idx, programs, cursor)
            check += len(programs)

    elif idx in(887,384,375,372,368,215,214,127):
        continue
    else:
        insert_into_db(idx,None, cursor)
        check += 24

    print("체크",idx,"=>",check)

print("결과 갯수->",result)

# 변경사항 커밋
conn.commit()

# 커서와 연결 닫기
cursor.close()
conn.close()

 

코드를 보면 먼저 DB설정 해주고,  df = pd.read_excel(file_path, header=2) 에 헤더2는 인덱스 2번째 행부터 읽는다 하는거다.

for index, row in df.iterrows():

의 반복문을 통해서 해당 인덱스 데이터에 스페이스,매체,프로그램 태그들을 리스트에 넣는데

range(3,8)은 위에 엑셀 사진보면 스페이스에 태그가 인덱스 3부터7까지니 range(3,8) 한거다.

insert_into_db(idx, spaces, cursor)

이 메소드를 호출해서 DB에 저장한다(cursor은 DB설정에서 했던거)

인서트 메소드는  스페이스,매체,프로그램 리스트가 비어있지 않으면 반복문을 통해 각 리스트 요소를 tad_dic의 값(태그의 인덱스)을 찾아오고 DB에 저장하는거다.