#!/usr/bin/env python3 """ 볼트 재질 정보 업데이트 스크립트 A320/A194M 패턴 등을 올바르게 인식하도록 기존 볼트들의 material_grade 재분류 """ import os import sys import psycopg2 from psycopg2.extras import RealDictCursor # 프로젝트 루트 디렉토리를 Python 경로에 추가 sys.path.append('/app') from app.services.bolt_classifier import classify_bolt_material def update_bolt_material_grades(): """기존 볼트들의 material_grade 업데이트""" # 데이터베이스 연결 try: conn = psycopg2.connect( host=os.getenv('DB_HOST', 'postgres'), port=os.getenv('DB_PORT', '5432'), database=os.getenv('DB_NAME', 'tk_mp_bom'), user=os.getenv('DB_USER', 'tkmp_user'), password=os.getenv('DB_PASSWORD', 'tkmp2024!') ) cursor = conn.cursor(cursor_factory=RealDictCursor) print("🔧 볼트 재질 정보 업데이트 시작...") # 볼트 카테고리 자재들 조회 cursor.execute(""" SELECT id, original_description, material_grade, full_material_grade FROM materials WHERE classified_category = 'BOLT' ORDER BY id """) bolts = cursor.fetchall() print(f"📊 총 {len(bolts)}개 볼트 발견") updated_count = 0 for bolt in bolts: bolt_id = bolt['id'] original_desc = bolt['original_description'] or '' current_material_grade = bolt['material_grade'] or '' current_full_grade = bolt['full_material_grade'] or '' # 볼트 재질 재분류 material_result = classify_bolt_material(original_desc) if material_result and material_result.get('standard') != 'UNKNOWN': new_standard = material_result.get('standard', '') new_grade = material_result.get('grade', '') # 새로운 material_grade 구성 if new_grade and new_grade != 'UNKNOWN': if new_standard in new_grade: # 이미 standard가 포함된 경우 (예: "ASTM A320/A194M") new_material_grade = new_grade else: # standard + grade 조합 (예: "ASTM A193" + "B7") new_material_grade = f"{new_standard} {new_grade}" if new_grade not in new_standard else new_standard else: new_material_grade = new_standard # 기존 값과 다른 경우에만 업데이트 if new_material_grade != current_material_grade: print(f"🔄 ID {bolt_id}: '{current_material_grade}' → '{new_material_grade}'") print(f" 원본: {original_desc}") cursor.execute(""" UPDATE materials SET material_grade = %s WHERE id = %s """, (new_material_grade, bolt_id)) updated_count += 1 # 변경사항 커밋 conn.commit() print(f"✅ 볼트 재질 정보 업데이트 완료: {updated_count}개 업데이트됨") # 업데이트 결과 확인 cursor.execute(""" SELECT material_grade, COUNT(*) as count FROM materials WHERE classified_category = 'BOLT' GROUP BY material_grade ORDER BY count DESC """) results = cursor.fetchall() print("\n📈 업데이트 후 볼트 재질 분포:") for result in results: print(f" {result['material_grade']}: {result['count']}개") except Exception as e: print(f"❌ 오류 발생: {str(e)}") if conn: conn.rollback() finally: if cursor: cursor.close() if conn: conn.close() if __name__ == "__main__": update_bolt_material_grades()