- 월비탕 1차~4차 단계별 처방 추가 (WBT001-1 ~ WBT001-4) - 삼소음 처방 추가 (SSE001) - 처방 추가 가이드 문서 작성 - 약재 성분 코드 확인 및 검증 스크립트 추가 월비탕: 단계별 비만치료 처방 (1차~4차) 삼소음: 리기화담, 해표산한 효능의 기침/가래 치료 처방 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
9.0 KiB
9.0 KiB
처방 데이터 추가 가이드
개요
이 문서는 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단계: 약재 성분 코드 확인
처방에 사용할 약재들의 성분 코드를 먼저 확인해야 합니다.
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단계: 처방 데이터 준비
처방 정보와 구성 약재 정보를 준비합니다.
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단계: 데이터베이스에 추가
준비한 데이터를 데이터베이스에 저장합니다.
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 스크립트를 사용하여 처방을 쉽게 추가할 수 있습니다.
- 스크립트 실행:
python3 add_prescription_data.py
- 스크립트 수정하여 새 처방 추가:
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: 사용자 정의 처방
데이터 검증
추가된 처방 확인
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()
처방 상세 정보 조회
# 특정 처방의 구성 약재 확인
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가 이미 존재하는지 확인
- 필요시 기존 처방 삭제 또는 코드 변경
예제: 실제 처방 추가
소청룡탕 추가 예제
{
'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': '조화제약'}, # 감초
]
}
갈근탕 추가 예제
{
'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테이블