# 처방 데이터 추가 가이드 ## 개요 이 문서는 K-Drug 시스템에 새로운 한방 처방을 추가하는 방법을 설명합니다. ## 데이터베이스 구조 ### 1. formulas 테이블 처방의 기본 정보를 저장하는 테이블입니다. | 컬럼명 | 타입 | 설명 | |--------|------|------| | formula_id | INTEGER | 처방 고유 ID (자동생성) | | formula_code | TEXT | 처방 코드 (예: SCR001) | | formula_name | TEXT | 처방 이름 (예: 소청룡탕) | | formula_type | TEXT | 처방 타입 (STANDARD/CUSTOM) | | base_cheop | INTEGER | 기본 첩수 | | base_pouches | INTEGER | 기본 포수 | | description | TEXT | 처방 설명 | | is_active | INTEGER | 활성 상태 (1: 활성, 0: 비활성) | ### 2. formula_ingredients 테이블 처방을 구성하는 약재 정보를 저장하는 테이블입니다. | 컬럼명 | 타입 | 설명 | |--------|------|------| | ingredient_id | INTEGER | 구성 약재 ID (자동생성) | | formula_id | INTEGER | 처방 ID (formulas 테이블 참조) | | ingredient_code | TEXT | 약재 성분 코드 (herb_masters 테이블 참조) | | grams_per_cheop | REAL | 1첩당 용량(g) | | notes | TEXT | 약재 역할/효능 설명 | | sort_order | INTEGER | 정렬 순서 | ### 3. herb_masters 테이블 약재 마스터 정보를 저장하는 테이블입니다. | 컬럼명 | 타입 | 설명 | |--------|------|------| | ingredient_code | VARCHAR(10) | 약재 성분 코드 (PK) | | herb_name | VARCHAR(100) | 약재 이름 | | herb_name_hanja | VARCHAR(100) | 약재 한자명 | | herb_name_latin | VARCHAR(200) | 약재 학명 | ## 처방 추가 절차 ### 1단계: 약재 성분 코드 확인 처방에 사용할 약재들의 성분 코드를 먼저 확인해야 합니다. ```python import sqlite3 conn = sqlite3.connect('database/kdrug.db') cursor = conn.cursor() # 약재 이름으로 성분 코드 검색 herb_name = "마황" cursor.execute(""" SELECT ingredient_code, herb_name FROM herb_masters WHERE herb_name LIKE ? """, (f'%{herb_name}%',)) results = cursor.fetchall() for code, name in results: print(f"{name}: {code}") conn.close() ``` ### 2단계: 처방 데이터 준비 처방 정보와 구성 약재 정보를 준비합니다. ```python prescription_data = { 'formula_code': 'SCR001', # 고유한 처방 코드 'formula_name': '소청룡탕', 'formula_type': 'STANDARD', # STANDARD 또는 CUSTOM 'base_cheop': 1, # 기본 첩수 'base_pouches': 1, # 기본 포수 'description': '처방 설명', 'ingredients': [ { 'code': '3147H1AHM', # 약재 성분 코드 'amount': 6.0, # 1첩당 용량(g) 'notes': '발한해표' # 약재 역할 }, # ... 추가 약재들 ] } ``` ### 3단계: 데이터베이스에 추가 준비한 데이터를 데이터베이스에 저장합니다. ```python import sqlite3 def add_prescription(prescription_data): conn = sqlite3.connect('database/kdrug.db') cursor = conn.cursor() try: # 1. formulas 테이블에 처방 추가 cursor.execute(""" INSERT INTO formulas ( formula_code, formula_name, formula_type, base_cheop, base_pouches, description, is_active, created_at, updated_at ) VALUES (?, ?, ?, ?, ?, ?, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) """, ( prescription_data['formula_code'], prescription_data['formula_name'], prescription_data['formula_type'], prescription_data['base_cheop'], prescription_data['base_pouches'], prescription_data['description'] )) formula_id = cursor.lastrowid # 2. formula_ingredients 테이블에 약재 추가 for ingredient in prescription_data['ingredients']: cursor.execute(""" INSERT INTO formula_ingredients ( formula_id, ingredient_code, grams_per_cheop, notes, sort_order, created_at ) VALUES (?, ?, ?, ?, 0, CURRENT_TIMESTAMP) """, ( formula_id, ingredient['code'], ingredient['amount'], ingredient['notes'] )) conn.commit() print(f"처방 '{prescription_data['formula_name']}' 추가 완료!") except Exception as e: conn.rollback() print(f"오류 발생: {e}") finally: conn.close() ``` ## 자동화 스크립트 사용법 ### add_prescription_data.py 스크립트 프로젝트에 포함된 `add_prescription_data.py` 스크립트를 사용하여 처방을 쉽게 추가할 수 있습니다. 1. 스크립트 실행: ```bash python3 add_prescription_data.py ``` 2. 스크립트 수정하여 새 처방 추가: ```python prescriptions = [ { 'formula_code': '새처방코드', 'formula_name': '새처방이름', 'formula_type': 'STANDARD', 'base_cheop': 1, 'base_pouches': 1, 'description': '처방 설명', 'ingredients': [ # 구성 약재 목록 ] } ] ``` ## 주의사항 ### 1. 성분 코드 확인 - 반드시 herb_masters 테이블에 존재하는 ingredient_code를 사용해야 합니다 - 보험 코드(insurance_code)가 아닌 성분 코드(ingredient_code)를 사용합니다 ### 2. 중복 확인 - formula_code는 고유해야 합니다 - 동일한 처방 코드로 중복 추가하지 않도록 주의합니다 ### 3. 약재 용량 - grams_per_cheop은 1첩 기준 용량입니다 - 소수점 사용 가능 (예: 1.5, 0.5) ### 4. 처방 타입 - STANDARD: 표준 처방 - CUSTOM: 사용자 정의 처방 ## 데이터 검증 ### 추가된 처방 확인 ```python import sqlite3 conn = sqlite3.connect('database/kdrug.db') cursor = conn.cursor() # 처방 목록 조회 cursor.execute(""" SELECT formula_code, formula_name, formula_type FROM formulas WHERE is_active = 1 """) for row in cursor.fetchall(): print(f"{row[0]}: {row[1]} ({row[2]})") conn.close() ``` ### 처방 상세 정보 조회 ```python # 특정 처방의 구성 약재 확인 formula_code = 'SCR001' cursor.execute(""" SELECT hm.herb_name, fi.grams_per_cheop, fi.notes FROM formulas f JOIN formula_ingredients fi ON f.formula_id = fi.formula_id JOIN herb_masters hm ON fi.ingredient_code = hm.ingredient_code WHERE f.formula_code = ? ORDER BY fi.grams_per_cheop DESC """, (formula_code,)) for herb_name, amount, notes in cursor.fetchall(): print(f"- {herb_name}: {amount}g ({notes})") ``` ## 문제 해결 ### 1. 약재를 찾을 수 없는 경우 - herb_masters 테이블에서 정확한 약재명 확인 - 대체 이름 검색 (예: 대조 → 대추, 백작약 → 작약) ### 2. 외래 키 제약 오류 - ingredient_code가 herb_masters 테이블에 존재하는지 확인 - formula_id가 올바른지 확인 ### 3. 중복 키 오류 - formula_code가 이미 존재하는지 확인 - 필요시 기존 처방 삭제 또는 코드 변경 ## 예제: 실제 처방 추가 ### 소청룡탕 추가 예제 ```python { 'formula_code': 'SCR001', 'formula_name': '소청룡탕', 'formula_type': 'STANDARD', 'base_cheop': 1, 'base_pouches': 1, 'description': '외감풍한, 내정수음으로 인한 기침, 천식을 치료하는 처방', 'ingredients': [ {'code': '3147H1AHM', 'amount': 6.0, 'notes': '발한해표'}, # 마황 {'code': '3419H1AHM', 'amount': 6.0, 'notes': '화영지통'}, # 백작약 {'code': '3342H1AHM', 'amount': 6.0, 'notes': '렴폐지해'}, # 오미자 {'code': '3182H1AHM', 'amount': 6.0, 'notes': '화담지구'}, # 반하 {'code': '3285H1AHM', 'amount': 4.0, 'notes': '온폐산한'}, # 세신 {'code': '3017H1AHM', 'amount': 4.0, 'notes': '온중산한'}, # 건강 {'code': '3033H1AHM', 'amount': 4.0, 'notes': '해표발한'}, # 계지 {'code': '3007H1AHM', 'amount': 4.0, 'notes': '조화제약'}, # 감초 ] } ``` ### 갈근탕 추가 예제 ```python { 'formula_code': 'GGT001', 'formula_name': '갈근탕', 'formula_type': 'STANDARD', 'base_cheop': 1, 'base_pouches': 1, 'description': '외감풍한으로 인한 두통, 발열, 오한, 항강을 치료하는 처방', 'ingredients': [ {'code': '3002H1AHM', 'amount': 8.0, 'notes': '승진해기'}, # 갈근 {'code': '3147H1AHM', 'amount': 6.0, 'notes': '발한해표'}, # 마황 {'code': '3115H1AHM', 'amount': 6.0, 'notes': '보중익기'}, # 대조 {'code': '3033H1AHM', 'amount': 4.0, 'notes': '해표발한'}, # 계지 {'code': '3419H1AHM', 'amount': 4.0, 'notes': '화영지통'}, # 작약 {'code': '3007H1AHM', 'amount': 4.0, 'notes': '조화제약'}, # 감초 {'code': '3017H1AHM', 'amount': 2.0, 'notes': '온중산한'}, # 건강 ] } ``` ## 참고 자료 - 데이터베이스 스키마: `database/kdrug.db` - 자동화 스크립트: `add_prescription_data.py` - 약재 마스터 데이터: `herb_masters` 테이블