- 개발/테스트 스크립트를 dev_scripts/ 폴더로 이동 - 스크린샷을 screenshots/ 폴더로 이동 - 백업 파일 보존 (.backup) - 처방 관련 추가 스크립트 포함 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
120 lines
4.3 KiB
Python
120 lines
4.3 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
데이터베이스 구조 정확히 분석
|
|
"""
|
|
|
|
import sqlite3
|
|
|
|
def analyze_structure():
|
|
conn = sqlite3.connect('database/kdrug.db')
|
|
cursor = conn.cursor()
|
|
|
|
print("=" * 80)
|
|
print("데이터베이스 구조 완전 분석")
|
|
print("=" * 80)
|
|
|
|
# 1. herb_items 분석
|
|
print("\n1. herb_items 테이블 (재고 관리):")
|
|
cursor.execute("SELECT COUNT(*) FROM herb_items")
|
|
count = cursor.fetchone()[0]
|
|
print(f" - 레코드 수: {count}")
|
|
|
|
cursor.execute("""
|
|
SELECT herb_item_id, insurance_code, herb_name, ingredient_code
|
|
FROM herb_items
|
|
WHERE herb_item_id IN (1, 2, 3)
|
|
ORDER BY herb_item_id
|
|
""")
|
|
print(" - 샘플 데이터:")
|
|
for row in cursor.fetchall():
|
|
print(f" ID={row[0]}: {row[2]} (보험코드: {row[1]}, 성분코드: {row[3]})")
|
|
|
|
# 2. herb_masters 분석
|
|
print("\n2. herb_masters 테이블 (성분코드 마스터):")
|
|
cursor.execute("SELECT COUNT(*) FROM herb_masters")
|
|
count = cursor.fetchone()[0]
|
|
print(f" - 레코드 수: {count}")
|
|
|
|
cursor.execute("""
|
|
SELECT ingredient_code, herb_name
|
|
FROM herb_masters
|
|
WHERE herb_name IN ('인삼', '감초', '당귀')
|
|
""")
|
|
print(" - 주요 약재:")
|
|
for row in cursor.fetchall():
|
|
print(f" {row[0]}: {row[1]}")
|
|
|
|
# 3. herb_master_extended 분석
|
|
print("\n3. herb_master_extended 테이블 (확장 정보):")
|
|
cursor.execute("SELECT COUNT(*) FROM herb_master_extended")
|
|
count = cursor.fetchone()[0]
|
|
print(f" - 레코드 수: {count}")
|
|
|
|
cursor.execute("""
|
|
SELECT herb_id, ingredient_code, name_korean
|
|
FROM herb_master_extended
|
|
WHERE name_korean IN ('인삼', '감초', '당귀')
|
|
""")
|
|
print(" - 주요 약재 herb_id:")
|
|
for row in cursor.fetchall():
|
|
print(f" herb_id={row[0]}: {row[2]} (성분코드: {row[1]})")
|
|
|
|
# 4. 관계 매핑 확인
|
|
print("\n4. 테이블 간 관계:")
|
|
print(" herb_items.ingredient_code → herb_masters.ingredient_code")
|
|
print(" herb_masters.ingredient_code → herb_master_extended.ingredient_code")
|
|
print(" herb_master_extended.herb_id → herb_item_tags.herb_id")
|
|
|
|
# 5. 올바른 JOIN 경로 제시
|
|
print("\n5. 올바른 JOIN 방법:")
|
|
print("""
|
|
방법 1: herb_items에서 시작 (재고 있는 약재만)
|
|
-----------------------------------------------
|
|
FROM herb_items hi
|
|
LEFT JOIN herb_masters hm ON hi.ingredient_code = hm.ingredient_code
|
|
LEFT JOIN herb_master_extended hme ON hm.ingredient_code = hme.ingredient_code
|
|
LEFT JOIN herb_item_tags hit ON hme.herb_id = hit.herb_id
|
|
LEFT JOIN herb_efficacy_tags het ON hit.tag_id = het.tag_id
|
|
|
|
방법 2: herb_masters에서 시작 (모든 약재)
|
|
-----------------------------------------------
|
|
FROM herb_masters hm
|
|
LEFT JOIN herb_master_extended hme ON hm.ingredient_code = hme.ingredient_code
|
|
LEFT JOIN herb_item_tags hit ON hme.herb_id = hit.herb_id
|
|
LEFT JOIN herb_efficacy_tags het ON hit.tag_id = het.tag_id
|
|
LEFT JOIN (재고 서브쿼리) inv ON hm.ingredient_code = inv.ingredient_code
|
|
""")
|
|
|
|
# 6. 실제 JOIN 테스트
|
|
print("\n6. JOIN 테스트 (인삼 예시):")
|
|
cursor.execute("""
|
|
SELECT
|
|
hi.herb_item_id,
|
|
hi.herb_name as item_name,
|
|
hi.ingredient_code,
|
|
hme.herb_id as master_herb_id,
|
|
hme.name_korean as master_name,
|
|
GROUP_CONCAT(het.tag_name) as tags
|
|
FROM herb_items hi
|
|
LEFT JOIN herb_masters hm ON hi.ingredient_code = hm.ingredient_code
|
|
LEFT JOIN herb_master_extended hme ON hm.ingredient_code = hme.ingredient_code
|
|
LEFT JOIN herb_item_tags hit ON hme.herb_id = hit.herb_id
|
|
LEFT JOIN herb_efficacy_tags het ON hit.tag_id = het.tag_id
|
|
WHERE hi.ingredient_code = '3400H1AHM'
|
|
GROUP BY hi.herb_item_id
|
|
""")
|
|
|
|
result = cursor.fetchone()
|
|
if result:
|
|
print(f" herb_item_id: {result[0]}")
|
|
print(f" 약재명: {result[1]}")
|
|
print(f" 성분코드: {result[2]}")
|
|
print(f" master_herb_id: {result[3]}")
|
|
print(f" master 약재명: {result[4]}")
|
|
print(f" 효능 태그: {result[5]}")
|
|
|
|
conn.close()
|
|
|
|
if __name__ == "__main__":
|
|
analyze_structure() |