#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 한약재 샘플 데이터 추가 스크립트 주요 약재들의 확장 정보와 효능 태그를 추가합니다. """ import sqlite3 from datetime import datetime def get_connection(): """데이터베이스 연결""" return sqlite3.connect('database/kdrug.db') def add_herb_extended_data(): """약재 확장 정보 추가""" conn = get_connection() cursor = conn.cursor() # 주요 약재들의 확장 정보 herbs_data = [ { 'ingredient_code': '3400H1AHM', # 인삼 'property': '온', 'taste': '감,미고', 'meridian_tropism': '비,폐,심', 'main_effects': '대보원기, 보비익폐, 생진지갈, 안신증지', 'indications': '기허증, 비허증, 폐허증, 심기허증, 진액부족, 당뇨병', 'contraindications': '실증, 열증, 음허화왕', 'precautions': '복용 중 무 섭취 금지, 고혈압 환자 주의', 'dosage_range': '3-9g', 'dosage_max': '30g', 'active_compounds': '인삼사포닌(ginsenoside Rb1, Rg1, Rg3), 다당체, 아미노산', 'pharmacological_effects': '면역증강, 항피로, 항산화, 혈당조절, 인지능력개선', 'clinical_applications': '만성피로, 면역력저하, 당뇨병 보조치료, 노인성 인지저하', 'tags': [('보기', 5), ('보양', 4), ('안신', 3), ('진통', 2)] }, { 'ingredient_code': '3400H1ADL', # 감초 'property': '평', 'taste': '감', 'meridian_tropism': '비,위,폐,심', 'main_effects': '보비익기, 청열해독, 거담지해, 완급지통, 조화제약', 'indications': '비허증, 해수, 인후통, 소화성궤양, 경련성 통증', 'contraindications': '습증, 수종, 고혈압', 'precautions': '장기복용 시 부종 주의, 칼륨 감소 주의', 'dosage_range': '2-10g', 'dosage_max': '30g', 'active_compounds': 'glycyrrhizin, liquiritin, flavonoid, triterpenoid', 'pharmacological_effects': '항염증, 항궤양, 간보호, 진해거담, 항알레르기', 'clinical_applications': '위염, 위궤양, 기관지염, 약물조화, 간염', 'tags': [('보기', 3), ('청열', 3), ('해독', 4), ('거담', 3), ('항염', 4)] }, { 'ingredient_code': '3400H1ACD', # 당귀 'property': '온', 'taste': '감,신', 'meridian_tropism': '간,심,비', 'main_effects': '보혈활혈, 조경지통, 윤장통변', 'indications': '혈허증, 월경부조, 무월경, 변비, 타박상', 'contraindications': '설사, 습성체질', 'precautions': '과량 복용 시 설사 주의', 'dosage_range': '5-15g', 'dosage_max': '30g', 'active_compounds': 'ligustilide, n-butylidene phthalide, ferulic acid', 'pharmacological_effects': '혈액순환개선, 항혈전, 자궁수축조절, 진정진통', 'clinical_applications': '빈혈, 월경불순, 산후조리, 혈액순환장애', 'tags': [('보혈', 5), ('활혈', 5), ('진통', 3)] }, { 'ingredient_code': '3400H1AGN', # 황기 'property': '온', 'taste': '감', 'meridian_tropism': '비,폐', 'main_effects': '보기승양, 고표지한, 이수소종, 탁독배농', 'indications': '기허증, 자한, 부종, 탈항, 자궁탈수', 'contraindications': '표실증, 음허화왕', 'precautions': '감기 초기 금지', 'dosage_range': '10-30g', 'dosage_max': '60g', 'active_compounds': 'astragaloside, polysaccharide, flavonoid', 'pharmacological_effects': '면역조절, 항바이러스, 항산화, 신기능보호', 'clinical_applications': '면역력저하, 만성신장염, 당뇨병, 심부전', 'tags': [('보기', 5), ('이수', 3), ('해표', 2)] }, { 'ingredient_code': '3400H1AEW', # 작약 'property': '량', 'taste': '고,산', 'meridian_tropism': '간,비', 'main_effects': '양혈조경, 유간지통, 렴음지한', 'indications': '혈허증, 월경부조, 간혈부족, 자한도한', 'contraindications': '양허설사', 'precautions': '한성약물과 병용 주의', 'dosage_range': '6-15g', 'dosage_max': '30g', 'active_compounds': 'paeoniflorin, albiflorin, benzoic acid', 'pharmacological_effects': '진정진통, 항경련, 항염증, 면역조절', 'clinical_applications': '월경통, 근육경련, 두통, 자가면역질환', 'tags': [('보혈', 4), ('평간', 4), ('진통', 4)] }, { 'ingredient_code': '3400H1ACF', # 천궁 'property': '온', 'taste': '신', 'meridian_tropism': '간,담,심포', 'main_effects': '활혈행기, 거풍지통', 'indications': '혈어증, 두통, 월경불순, 풍습비통', 'contraindications': '음허화왕, 월경과다', 'precautions': '출혈 경향 환자 주의', 'dosage_range': '3-10g', 'dosage_max': '15g', 'active_compounds': 'ligustilide, senkyunolide, ferulic acid', 'pharmacological_effects': '혈관확장, 항혈전, 진정진통, 항염증', 'clinical_applications': '편두통, 혈관성 두통, 어혈증, 월경통', 'tags': [('활혈', 5), ('이기', 4), ('진통', 5)] }, { 'ingredient_code': '3400H1ACG', # 지황(숙지황) 'property': '온', 'taste': '감', 'meridian_tropism': '간,신', 'main_effects': '보혈자음, 익정전수', 'indications': '혈허증, 간신음허, 수발조백, 유정도한', 'contraindications': '비허설사, 담습', 'precautions': '소화불량 주의', 'dosage_range': '10-30g', 'dosage_max': '60g', 'active_compounds': 'catalpol, rehmannioside, aucubin', 'pharmacological_effects': '조혈촉진, 면역조절, 혈당강하, 신경보호', 'clinical_applications': '빈혈, 당뇨병, 치매예방, 불임증', 'tags': [('보혈', 5), ('보음', 5)] }, { 'ingredient_code': '3400H1AFJ', # 백출 'property': '온', 'taste': '고,감', 'meridian_tropism': '비,위', 'main_effects': '건비익기, 조습이수, 지한안태', 'indications': '비허증, 식욕부진, 설사, 수종, 자한', 'contraindications': '음허조갈', 'precautions': '진액부족 시 주의', 'dosage_range': '6-15g', 'dosage_max': '30g', 'active_compounds': 'atractylenolide, atractylon', 'pharmacological_effects': '위장운동촉진, 이뇨, 항염증, 항종양', 'clinical_applications': '만성설사, 부종, 임신오조', 'tags': [('보기', 4), ('이수', 4), ('소화', 3)] }, { 'ingredient_code': '3400H1AGM', # 복령 'property': '평', 'taste': '감,담', 'meridian_tropism': '심,비,폐,신', 'main_effects': '이수삼습, 건비안신', 'indications': '수종, 소변불리, 비허설사, 불면, 심계', 'contraindications': '음허진액부족', 'precautions': '이뇨제와 병용 주의', 'dosage_range': '10-15g', 'dosage_max': '30g', 'active_compounds': 'pachymic acid, polysaccharide', 'pharmacological_effects': '이뇨, 진정, 항염증, 면역조절', 'clinical_applications': '부종, 불면증, 만성설사', 'tags': [('이수', 5), ('안신', 3), ('보기', 2)] }, { 'ingredient_code': '3400H1AGI', # 반하 'property': '온', 'taste': '신', 'meridian_tropism': '비,위,폐', 'main_effects': '조습화담, 강역지구, 소비산결', 'indications': '습담, 구토, 해수담다, 현훈', 'contraindications': '음허조해, 임신', 'precautions': '임산부 금기, 생품 독성 주의', 'dosage_range': '5-10g', 'dosage_max': '15g', 'active_compounds': 'ephedrine, β-sitosterol', 'pharmacological_effects': '진토, 진해거담, 항종양', 'clinical_applications': '임신오조, 기관지염, 현훈증', 'tags': [('거담', 5), ('소화', 3)] } ] for herb in herbs_data: # herb_master_extended 업데이트 cursor.execute(""" UPDATE herb_master_extended SET property = ?, taste = ?, meridian_tropism = ?, main_effects = ?, indications = ?, contraindications = ?, precautions = ?, dosage_range = ?, dosage_max = ?, active_compounds = ?, pharmacological_effects = ?, clinical_applications = ?, updated_at = CURRENT_TIMESTAMP WHERE ingredient_code = ? """, ( herb['property'], herb['taste'], herb['meridian_tropism'], herb['main_effects'], herb['indications'], herb['contraindications'], herb['precautions'], herb['dosage_range'], herb['dosage_max'], herb['active_compounds'], herb['pharmacological_effects'], herb['clinical_applications'], herb['ingredient_code'] )) # herb_id 조회 cursor.execute(""" SELECT herb_id FROM herb_master_extended WHERE ingredient_code = ? """, (herb['ingredient_code'],)) result = cursor.fetchone() if result: herb_id = result[0] # 효능 태그 매핑 for tag_name, strength in herb.get('tags', []): # 태그 ID 조회 cursor.execute(""" SELECT tag_id FROM herb_efficacy_tags WHERE tag_name = ? """, (tag_name,)) tag_result = cursor.fetchone() if tag_result: tag_id = tag_result[0] # 태그 매핑 추가 cursor.execute(""" INSERT OR REPLACE INTO herb_item_tags (herb_id, tag_id, strength) VALUES (?, ?, ?) """, (herb_id, tag_id, strength)) print(f"✅ {herb['ingredient_code']} 데이터 추가 완료") conn.commit() conn.close() def add_prescription_rules(): """처방 배합 규칙 추가""" conn = get_connection() cursor = conn.cursor() # 몇 가지 대표적인 배합 규칙 추가 rules = [ # 상수(相須) - 서로 도와서 효과를 증강 { 'herb1': '인삼', 'herb2': '황기', 'relationship': '상수', 'description': '두 약재가 함께 사용되면 보기 효과가 증강됨', 'severity': 0 }, { 'herb1': '당귀', 'herb2': '천궁', 'relationship': '상수', 'description': '혈액순환 개선 효과가 증강됨', 'severity': 0 }, # 상사(相使) - 한 약이 다른 약의 효능을 도움 { 'herb1': '반하', 'herb2': '생강', 'relationship': '상사', 'description': '생강이 반하의 독성을 감소시킴', 'severity': 0 }, # 상반(相反) - 함께 사용하면 독성이나 부작용 발생 { 'herb1': '감초', 'herb2': '감수', 'relationship': '상반', 'description': '십팔반(十八反) - 함께 사용 금기', 'severity': 5, 'is_absolute': True }, { 'herb1': '인삼', 'herb2': '오령지', 'relationship': '상반', 'description': '십구외(十九畏) - 함께 사용 주의', 'severity': 4, 'is_absolute': False } ] for rule in rules: # herb_id 조회 cursor.execute(""" SELECT herb_id FROM herb_master_extended WHERE name_korean = ? """, (rule['herb1'],)) herb1_result = cursor.fetchone() cursor.execute(""" SELECT herb_id FROM herb_master_extended WHERE name_korean = ? """, (rule['herb2'],)) herb2_result = cursor.fetchone() if herb1_result and herb2_result: cursor.execute(""" INSERT OR REPLACE INTO prescription_rules (herb1_id, herb2_id, relationship_type, description, severity_level, is_absolute) VALUES (?, ?, ?, ?, ?, ?) """, ( herb1_result[0], herb2_result[0], rule['relationship'], rule['description'], rule['severity'], rule.get('is_absolute', False) )) print(f"✅ {rule['herb1']} - {rule['herb2']} 규칙 추가") conn.commit() conn.close() def main(): """메인 실행 함수""" print("\n" + "="*80) print("한약재 샘플 데이터 추가") print("="*80 + "\n") try: # 1. 약재 확장 정보 및 태그 추가 print("1. 약재 확장 정보 추가 중...") add_herb_extended_data() # 2. 처방 규칙 추가 print("\n2. 처방 배합 규칙 추가 중...") add_prescription_rules() print("\n✨ 모든 샘플 데이터가 성공적으로 추가되었습니다!") except Exception as e: print(f"\n❌ 오류 발생: {e}") import traceback traceback.print_exc() if __name__ == "__main__": main()