- 개발/테스트 스크립트를 dev_scripts/ 폴더로 이동 - 스크린샷을 screenshots/ 폴더로 이동 - 백업 파일 보존 (.backup) - 처방 관련 추가 스크립트 포함 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
448 lines
15 KiB
Python
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() |