kdrug-inventory-system/migrations/add_herb_extended_info_tables.py
시골약사 ad9ac396e2 chore: 개발 파일 정리 및 구조화
- 개발/테스트 스크립트를 dev_scripts/ 폴더로 이동
- 스크린샷을 screenshots/ 폴더로 이동
- 백업 파일 보존 (.backup)
- 처방 관련 추가 스크립트 포함

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-18 04:44:48 +00:00

448 lines
15 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
한약재 확장 정보 테이블 추가
- herb_master_extended: 약재 상세 정보
- herb_research_papers: 연구 문헌
- herb_safety_info: 안전성 정보
- prescription_rules: 처방 구성 규칙
- disease_herb_mapping: 질병-약재 매핑
- data_update_logs: AI/API 업데이트 로그
"""
import sqlite3
from datetime import datetime
def get_connection():
"""데이터베이스 연결"""
return sqlite3.connect('../database/kdrug.db')
def create_herb_master_extended():
"""약재 확장 정보 테이블 생성"""
conn = get_connection()
cursor = conn.cursor()
# 기존 테이블 확인
cursor.execute("""
SELECT name FROM sqlite_master
WHERE type='table' AND name='herb_master_extended'
""")
if cursor.fetchone():
print("herb_master_extended 테이블이 이미 존재합니다.")
else:
cursor.execute("""
CREATE TABLE herb_master_extended (
herb_id INTEGER PRIMARY KEY AUTOINCREMENT,
ingredient_code VARCHAR(10) UNIQUE,
-- 기본 명칭
name_korean VARCHAR(100) NOT NULL,
name_hanja VARCHAR(100),
name_latin VARCHAR(200),
name_english VARCHAR(200),
name_pharmaceutical VARCHAR(200), -- 약전명
-- 분류 정보
family_latin VARCHAR(100), -- 과명
genus_species VARCHAR(200), -- 학명
origin_plant TEXT, -- 기원식물
medicinal_part VARCHAR(100), -- 약용부위
-- 성미귀경
property VARCHAR(50), -- 성(性): 한/열/온/량/평
taste VARCHAR(100), -- 미(味): 고/감/산/신/함/담
meridian_tropism TEXT, -- 귀경: 입경 경락
-- 효능 효과
main_effects TEXT, -- 주요 효능
indications TEXT, -- 적응증
contraindications TEXT, -- 금기증
precautions TEXT, -- 주의사항
-- 용법 용량
dosage_range VARCHAR(50), -- 상용량 (예: "3-12g")
dosage_max VARCHAR(50), -- 극량
preparation_method TEXT, -- 포제법
-- 성분 정보
active_compounds TEXT, -- 주요 성분
chemical_constituents TEXT, -- 화학 성분 상세 (JSON)
-- 약리 작용
pharmacological_effects TEXT, -- 약리작용
clinical_applications TEXT, -- 임상응용
-- 상호작용
drug_interactions TEXT, -- 약물 상호작용 (JSON)
food_interactions TEXT, -- 음식 상호작용 (JSON)
-- 품질 기준
quality_standards TEXT, -- 품질 기준
identification_method TEXT, -- 감별법
-- 메타데이터
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
data_source VARCHAR(100), -- 데이터 출처
reliability_score INTEGER, -- 신뢰도 점수 (1-10)
review_status VARCHAR(20) -- 검토 상태
)
""")
print("✅ herb_master_extended 테이블이 생성되었습니다.")
# 기존 herb_masters 데이터 마이그레이션
cursor.execute("""
INSERT INTO herb_master_extended (
ingredient_code, name_korean, name_hanja, name_latin
)
SELECT
ingredient_code,
herb_name AS name_korean,
herb_name_hanja AS name_hanja,
herb_name_latin AS name_latin
FROM herb_masters
""")
print(f" - {cursor.rowcount}개의 기존 데이터가 마이그레이션되었습니다.")
conn.commit()
conn.close()
def create_herb_research_papers():
"""약재 연구 문헌 테이블 생성"""
conn = get_connection()
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS herb_research_papers (
paper_id INTEGER PRIMARY KEY AUTOINCREMENT,
herb_id INTEGER,
title TEXT NOT NULL,
authors TEXT,
journal VARCHAR(200),
publication_year INTEGER,
volume VARCHAR(50),
pages VARCHAR(50),
doi VARCHAR(100),
pubmed_id VARCHAR(20),
abstract TEXT,
keywords TEXT,
study_type VARCHAR(50), -- RCT, 관찰연구, 리뷰 등
evidence_level INTEGER, -- 근거수준 (1-5)
findings TEXT, -- 주요 발견
clinical_relevance TEXT, -- 임상적 의미
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
indexed_at TIMESTAMP
)
""")
print("✅ herb_research_papers 테이블이 생성되었습니다.")
conn.commit()
conn.close()
def create_herb_safety_info():
"""약재 안전성 정보 테이블 생성"""
conn = get_connection()
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS herb_safety_info (
safety_id INTEGER PRIMARY KEY AUTOINCREMENT,
herb_id INTEGER,
-- 독성 정보
toxicity_level VARCHAR(20), -- 독성 등급
ld50_value VARCHAR(50), -- 반수치사량
toxic_compounds TEXT, -- 독성 성분
-- 부작용
common_side_effects TEXT, -- 흔한 부작용
rare_side_effects TEXT, -- 드문 부작용
serious_adverse_events TEXT, -- 중대 이상반응
-- 특수 집단
pregnancy_category VARCHAR(10), -- 임신 등급
pregnancy_safety TEXT, -- 임신 안전성
lactation_safety TEXT, -- 수유 안전성
pediatric_use TEXT, -- 소아 사용
geriatric_use TEXT, -- 노인 사용
-- 모니터링
monitoring_parameters TEXT, -- 모니터링 항목
laboratory_tests TEXT, -- 필요 검사
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
print("✅ herb_safety_info 테이블이 생성되었습니다.")
conn.commit()
conn.close()
def create_prescription_rules():
"""처방 구성 규칙 테이블 생성"""
conn = get_connection()
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS prescription_rules (
rule_id INTEGER PRIMARY KEY AUTOINCREMENT,
-- 배합 규칙
herb1_id INTEGER,
herb2_id INTEGER,
relationship_type VARCHAR(50), -- 상수/상사/상외/상오/상쇄/상반/상살
description TEXT,
clinical_significance TEXT,
evidence_source TEXT,
severity_level INTEGER, -- 심각도 (1-5)
action_required VARCHAR(50), -- 조치사항
is_absolute BOOLEAN, -- 절대 금기 여부
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
# 인덱스 추가
cursor.execute("""
CREATE INDEX IF NOT EXISTS idx_prescription_rules_herbs
ON prescription_rules(herb1_id, herb2_id)
""")
print("✅ prescription_rules 테이블이 생성되었습니다.")
conn.commit()
conn.close()
def create_disease_herb_mapping():
"""질병-약재 매핑 테이블 생성"""
conn = get_connection()
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS disease_herb_mapping (
mapping_id INTEGER PRIMARY KEY AUTOINCREMENT,
disease_code VARCHAR(20), -- KCD 코드
disease_name VARCHAR(200),
herb_id INTEGER,
indication_type VARCHAR(50), -- 주적응증/부적응증
evidence_level INTEGER, -- 근거수준
recommendation_grade VARCHAR(10), -- 권고등급
clinical_notes TEXT,
reference_sources TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
# 인덱스 추가
cursor.execute("""
CREATE INDEX IF NOT EXISTS idx_disease_herb_mapping
ON disease_herb_mapping(disease_code, herb_id)
""")
print("✅ disease_herb_mapping 테이블이 생성되었습니다.")
conn.commit()
conn.close()
def create_data_update_logs():
"""AI/API 업데이트 로그 테이블 생성"""
conn = get_connection()
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS data_update_logs (
log_id INTEGER PRIMARY KEY AUTOINCREMENT,
update_type VARCHAR(50), -- AI/API/MANUAL
source VARCHAR(100), -- 데이터 소스
target_table VARCHAR(50),
target_id INTEGER,
before_data TEXT, -- 변경 전 데이터 (JSON)
after_data TEXT, -- 변경 후 데이터 (JSON)
update_reason TEXT,
confidence_score REAL, -- AI 신뢰도
is_reviewed BOOLEAN DEFAULT 0,
reviewed_by VARCHAR(50),
review_notes TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
print("✅ data_update_logs 테이블이 생성되었습니다.")
conn.commit()
conn.close()
def create_herb_efficacy_tags():
"""약재 효능 태그 시스템 테이블 생성"""
conn = get_connection()
cursor = conn.cursor()
# 효능 태그 마스터 테이블
cursor.execute("""
CREATE TABLE IF NOT EXISTS herb_efficacy_tags (
tag_id INTEGER PRIMARY KEY AUTOINCREMENT,
tag_name VARCHAR(50) UNIQUE NOT NULL,
tag_category VARCHAR(30), -- 보익/거사/조리/기타
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
# 약재-태그 매핑 테이블
cursor.execute("""
CREATE TABLE IF NOT EXISTS herb_item_tags (
item_tag_id INTEGER PRIMARY KEY AUTOINCREMENT,
herb_id INTEGER,
tag_id INTEGER,
strength INTEGER DEFAULT 3, -- 효능 강도 (1-5)
notes TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(herb_id, tag_id)
)
""")
# 기본 효능 태그 삽입
basic_tags = [
('보혈', '보익', '혈을 보하는 효능'),
('보기', '보익', '기를 보하는 효능'),
('보양', '보익', '양기를 보하는 효능'),
('보음', '보익', '음액을 보하는 효능'),
('활혈', '거사', '혈액순환을 개선하는 효능'),
('거담', '거사', '담을 제거하는 효능'),
('이수', '거사', '수분대사를 개선하는 효능'),
('해표', '거사', '표증을 해소하는 효능'),
('청열', '거사', '열을 내리는 효능'),
('해독', '거사', '독을 해소하는 효능'),
('이기', '조리', '기의 순환을 조절하는 효능'),
('소화', '조리', '소화를 돕는 효능'),
('안신', '조리', '정신을 안정시키는 효능'),
('평간', '조리', '간기능을 조절하는 효능'),
('지혈', '기타', '출혈을 멈추는 효능'),
('진통', '기타', '통증을 완화하는 효능'),
('항염', '기타', '염증을 억제하는 효능'),
('항균', '기타', '균을 억제하는 효능')
]
for tag_name, tag_category, description in basic_tags:
cursor.execute("""
INSERT OR IGNORE INTO herb_efficacy_tags (tag_name, tag_category, description)
VALUES (?, ?, ?)
""", (tag_name, tag_category, description))
print("✅ herb_efficacy_tags 테이블이 생성되었습니다.")
print(f" - {len(basic_tags)}개의 기본 효능 태그가 등록되었습니다.")
conn.commit()
conn.close()
def add_sample_data():
"""샘플 데이터 추가"""
conn = get_connection()
cursor = conn.cursor()
# 인삼 상세 정보 업데이트
cursor.execute("""
UPDATE herb_master_extended
SET
property = '',
taste = '감,미고',
meridian_tropism = '비,폐,심',
main_effects = '대보원기, 보비익폐, 생진지갈, 안신증지',
indications = '기허증, 비허증, 폐허증, 심기허증, 진액부족',
contraindications = '실증, 열증',
precautions = '복용 중 무 섭취 금지',
dosage_range = '3-9g',
dosage_max = '30g',
active_compounds = '인삼사포닌(ginsenoside), 다당체, 아미노산',
pharmacological_effects = '면역증강, 항피로, 항산화, 혈당조절',
clinical_applications = '만성피로, 면역력저하, 당뇨병 보조치료'
WHERE ingredient_code = '3400H1AHM'
""")
# 감초 상세 정보 업데이트
cursor.execute("""
UPDATE herb_master_extended
SET
property = '',
taste = '',
meridian_tropism = '비,위,폐,심',
main_effects = '보비익기, 청열해독, 거담지해, 완급지통, 조화제약',
indications = '비허증, 해수, 인후통, 소화성궤양',
contraindications = '습증, 수종',
precautions = '장기복용 시 부종 주의',
dosage_range = '2-10g',
dosage_max = '30g',
active_compounds = 'glycyrrhizin, flavonoid, triterpenoid',
pharmacological_effects = '항염증, 항궤양, 간보호, 진해거담',
clinical_applications = '위염, 위궤양, 기관지염, 약물조화'
WHERE ingredient_code = '3400H1ADL'
""")
print("✅ 샘플 데이터가 추가되었습니다.")
conn.commit()
conn.close()
def main():
"""메인 실행 함수"""
print("\n" + "="*80)
print("한약재 확장 정보 시스템 테이블 생성")
print("="*80 + "\n")
try:
# 1. 확장 정보 테이블 생성
create_herb_master_extended()
# 2. 연구 문헌 테이블 생성
create_herb_research_papers()
# 3. 안전성 정보 테이블 생성
create_herb_safety_info()
# 4. 처방 규칙 테이블 생성
create_prescription_rules()
# 5. 질병-약재 매핑 테이블 생성
create_disease_herb_mapping()
# 6. 업데이트 로그 테이블 생성
create_data_update_logs()
# 7. 효능 태그 시스템 생성
create_herb_efficacy_tags()
# 8. 샘플 데이터 추가
add_sample_data()
print("\n✨ 모든 테이블이 성공적으로 생성되었습니다!")
except Exception as e:
print(f"\n❌ 오류 발생: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
main()