import logging import sqlite3 from src.sp_manager import SupabaseManager from datetime import datetime from loggerModule import Logger import getpass def upload_categories_from_db_to_supabase(db_path): try: # 로깅 설정 logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] %(message)s') logger = Logger() # 로그인 정보 입력 받기 logger.log("Supabase 로그인이 필요합니다.") email = input("이메일 주소를 입력하세요: ") password = getpass.getpass("비밀번호를 입력하세요: ") # Supabase 연결 logger.log("Supabase에 연결 중...") sp_manager = SupabaseManager(logger=logger) # 로그인 시도 logger.log("Supabase에 로그인 시도 중...") login_result = sp_manager.login(email, password) if not login_result: logger.log("로그인에 실패했습니다. 프로그램을 종료합니다.") return False logger.log("로그인 성공!") # SQLite 데이터베이스 연결 logger.log(f"데이터베이스 '{db_path}'에서 카테고리 데이터 로드 중...") conn = sqlite3.connect(db_path) conn.row_factory = sqlite3.Row cursor = conn.cursor() # base_category 테이블에서 데이터 읽기 cursor.execute("SELECT * FROM base_category") rows = cursor.fetchall() if not rows: logger.log("base_category 테이블에 데이터가 없습니다.") conn.close() return False # 데이터 준비 current_time = datetime.now().isoformat() records = [] for row in rows: record = { 'category1': row['category1'] if row['category1'] is not None else '', 'category2': row['category2'] if row['category2'] is not None else '', 'category3': row['category3'] if row['category3'] is not None else '', 'category4': row['category4'] if row['category4'] is not None else '', 'p_ss_category_code': row['p_ss_category_code'], 'is_valid': True, 'created_at': current_time, 'updated_at': current_time } records.append(record) conn.close() logger.log(f"{len(records)}개의 카테고리 레코드를 로드했습니다.") # 테이블 존재 여부 확인만 하고, 존재하지 않으면 생성 logger.log("base_category 테이블 확인 중...") try: # 단순히 한 개의 레코드를 가져와서 테이블이 존재하는지 확인 sp_manager.client.table("base_category").select("*").limit(1).execute() logger.log("base_category 테이블이 이미 존재합니다.") except Exception as e: # 테이블이 없는 경우 생성 logger.log("base_category 테이블 생성 중...") sp_manager.create_base_category_table() # 데이터 업로드 logger.log(f"{len(records)}개의 카테고리 데이터를 Supabase에 업로드 중...") # 일괄 삽입 try: # 테이블이 비어있다고 했으므로 삭제 작업 생략 logger.log("카테고리 데이터 업로드 시작...") # 새 데이터 삽입 batch_size = 100 for i in range(0, len(records), batch_size): batch = records[i:i+batch_size] try: response = sp_manager.client.table("base_category").insert(batch).execute() logger.log(f"배치 {i//batch_size + 1} 업로드 완료: {len(batch)}개 레코드") except Exception as e: logger.log(f"배치 업로드 중 오류 발생: {str(e)}") # 오류 발생 시 더 작은 배치로 시도 if len(batch) > 1: logger.log("배치 크기를 줄여서 다시 시도합니다.") for single_record in batch: try: sp_manager.client.table("base_category").insert(single_record).execute() logger.log("한 개 레코드 업로드 완료") except Exception as inner_e: logger.log(f"단일 레코드 업로드 중 오류 발생: {str(inner_e)}") logger.log("모든 카테고리 데이터가 성공적으로 업로드되었습니다.") return True except Exception as e: logger.log(f"데이터 업로드 중 오류 발생: {str(e)}") return False except Exception as e: logger.log(f"카테고리 업로드 중 오류 발생: {str(e)}") return False if __name__ == "__main__": db_path = "user_data/user_data_909d2ef8-7053-4006-ab40-49eb49f20383.db" # DB 파일 경로 upload_categories_from_db_to_supabase(db_path)