feat: 약재 효능 태그 시스템 추가
- herb_efficacy_tags 테이블 생성 (효능 마스터) - herb_item_tags 테이블 생성 (약재-효능 다대다 관계) - 18개 기본 효능 태그 등록 (보혈, 활혈, 보기 등) - Git 사용 가이드라인 문서 추가 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
448
migrations/add_herb_extended_info_tables.py
Normal file
448
migrations/add_herb_extended_info_tables.py
Normal file
@@ -0,0 +1,448 @@
|
||||
#!/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,
|
||||
references 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()
|
||||
Reference in New Issue
Block a user