kdrug-inventory-system/add_missing_herbs.py
시골약사 54af26e384 feat: 쌍화탕 처방 완성 (12종 약재)
- 누락된 4종 약재 추가 (당귀, 백작약, 인삼, 생강)
- 각 약재별 효능 태그 연결
- 쌍화탕 처방 구성 완료: 총 12종, 1첩 53g
- 스키마 확인 후 올바른 컬럼명 사용 (base_cheop, base_pouches)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-15 09:54:37 +00:00

135 lines
5.0 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
누락된 약재 추가 스크립트
"""
import sqlite3
def add_missing_herbs():
conn = sqlite3.connect('database/kdrug.db')
cursor = conn.cursor()
try:
# 누락된 약재 추가
missing_herbs = [
('A001100', '당귀', '보혈'), # 보혈약
('A001200', '백작약', '보혈'), # 보혈약
('A001300', '인삼', '대보원기'), # 대보원기약
('A001400', '생강', '온중'), # 온중약
]
print("=== 누락된 약재 추가 ===")
for code, name, efficacy in missing_herbs:
# 약재가 이미 있는지 확인
cursor.execute("SELECT herb_item_id FROM herb_items WHERE herb_name = ?", (name,))
if cursor.fetchone():
print(f" ⚠️ {name} - 이미 존재함")
continue
# 약재 추가
cursor.execute("""
INSERT INTO herb_items (insurance_code, herb_name, specification, default_unit, is_active)
VALUES (?, ?, ?, 'g', 1)
""", (code, name, ''))
herb_id = cursor.lastrowid
print(f"{name} (ID: {herb_id}) 추가 완료")
# 효능 태그 연결
cursor.execute("SELECT tag_id FROM herb_efficacy_tags WHERE tag_name = ?", (efficacy,))
tag_result = cursor.fetchone()
if tag_result:
tag_id = tag_result[0]
cursor.execute("""
INSERT OR IGNORE INTO herb_item_tags (herb_item_id, tag_id)
VALUES (?, ?)
""", (herb_id, tag_id))
print(f" → 효능 '{efficacy}' 연결")
conn.commit()
# 쌍화탕 처방 재구성 시도
print("\n=== 쌍화탕 처방 재구성 ===")
# 쌍화탕 처방 ID 가져오기
cursor.execute("SELECT formula_id FROM formulas WHERE formula_name = '쌍화탕'")
formula_result = cursor.fetchone()
if formula_result:
formula_id = formula_result[0]
# 현재 없는 약재들 다시 추가 시도
missing_ingredients = [
('당귀', 6.0, '보혈'),
('백작약', 6.0, '보혈'),
('인삼', 4.0, '대보원기'),
('생강', 5.0, '온중'),
]
for herb_name, grams, notes in missing_ingredients:
# 이미 등록되었는지 확인
cursor.execute("""
SELECT fi.ingredient_id
FROM formula_ingredients fi
JOIN herb_items h ON fi.herb_item_id = h.herb_item_id
WHERE fi.formula_id = ? AND h.herb_name = ?
""", (formula_id, herb_name))
if cursor.fetchone():
print(f" ⚠️ {herb_name} - 이미 처방에 포함됨")
continue
# 약재 ID 찾기
cursor.execute("SELECT herb_item_id FROM herb_items WHERE herb_name = ?", (herb_name,))
herb_result = cursor.fetchone()
if herb_result:
herb_id = herb_result[0]
cursor.execute("""
INSERT INTO formula_ingredients (
formula_id, herb_item_id, grams_per_cheop, notes
) VALUES (?, ?, ?, ?)
""", (formula_id, herb_id, grams, notes))
print(f"{herb_name}: {grams}g ({notes}) 추가")
conn.commit()
# 최종 쌍화탕 구성 확인
print("\n=== 최종 쌍화탕 구성 확인 ===")
cursor.execute("""
SELECT
h.herb_name,
fi.grams_per_cheop,
fi.notes,
GROUP_CONCAT(et.tag_name) as efficacy_tags
FROM formula_ingredients fi
JOIN herb_items h ON fi.herb_item_id = h.herb_item_id
LEFT JOIN herb_item_tags hit ON h.herb_item_id = hit.herb_item_id
LEFT JOIN herb_efficacy_tags et ON hit.tag_id = et.tag_id
WHERE fi.formula_id = (SELECT formula_id FROM formulas WHERE formula_name = '쌍화탕')
GROUP BY h.herb_name, fi.grams_per_cheop, fi.notes
ORDER BY fi.grams_per_cheop DESC
""")
total_grams = 0
for herb_name, grams, notes, tags in cursor.fetchall():
total_grams += grams
tags_display = f" [{tags}]" if tags else ""
print(f" - {herb_name}: {grams}g ({notes}){tags_display}")
print(f"\n 📊 총 {cursor.rowcount}종 약재")
print(f" 💊 1첩 총량: {total_grams}g")
print(f" 📦 20첩 총량: {total_grams * 20}g")
print("\n✅ 약재 추가 및 처방 재구성 완료!")
except Exception as e:
print(f"❌ 오류 발생: {e}")
conn.rollback()
finally:
conn.close()
if __name__ == "__main__":
add_missing_herbs()