- product_master 테이블: 제품 마스터 (바코드, 이름, 성분, 태그) - product_categories: 제품 카테고리 22개 (진통제, 소화제 등) - product_category_mapping: 다대다 매핑 (하나의 제품이 여러 카테고리) - disease_codes: 질병 코드 ICD-10 12개 - disease_product_mapping: 질병-제품 매핑 - 샘플 제품 3개 추가 (탁센, 베아제, 마그비맥스) - BARCODE 컬럼 95.79% 보유율 확인 - 온톨로지 기반 추천 시스템 설계 문서 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
138 lines
5.2 KiB
Python
138 lines
5.2 KiB
Python
"""
|
|
샘플 제품 데이터 추가
|
|
"""
|
|
|
|
import sqlite3
|
|
import os
|
|
import json
|
|
|
|
def insert_sample_products():
|
|
"""실제 바코드로 샘플 제품 추가"""
|
|
db_path = os.path.join(os.path.dirname(__file__), 'db', 'mileage.db')
|
|
conn = sqlite3.connect(db_path)
|
|
cursor = conn.cursor()
|
|
|
|
# 샘플 제품 데이터
|
|
products = [
|
|
{
|
|
"barcode": "8806436016712",
|
|
"product_name": "탁센캡슐",
|
|
"manufacturer": "동아제약",
|
|
"drug_classification": "일반의약품",
|
|
"ingredients": [
|
|
{"name": "나프록센", "amount": "250mg", "role": "주성분"}
|
|
],
|
|
"tags_symptoms": ["생리통", "치통", "골관절염", "두통", "근육통"],
|
|
"tags_ingredients": ["나프록센 250mg", "비스테로이드성 소염진통제"],
|
|
"tags_effects": ["진통", "소염", "해열"],
|
|
"categories": [
|
|
{"name": "진통소염제", "score": 1.0},
|
|
{"name": "진통제", "score": 0.9},
|
|
{"name": "해열제", "score": 0.3}
|
|
]
|
|
},
|
|
{
|
|
"barcode": "8806606002231",
|
|
"product_name": "베아제정(10정)",
|
|
"manufacturer": "대웅제약",
|
|
"drug_classification": "일반의약품",
|
|
"ingredients": [
|
|
{"name": "판크레아틴", "amount": "150mg", "role": "주성분"}
|
|
],
|
|
"tags_symptoms": ["소화불량", "복부팽만", "가스"],
|
|
"tags_ingredients": ["판크레아틴 150mg", "소화효소"],
|
|
"tags_effects": ["소화촉진", "가스제거"],
|
|
"categories": [
|
|
{"name": "소화제", "score": 1.0},
|
|
{"name": "위장약", "score": 0.8}
|
|
]
|
|
},
|
|
{
|
|
"barcode": "8806265019618",
|
|
"product_name": "마그비맥스",
|
|
"manufacturer": "일양약품",
|
|
"drug_classification": "일반의약품",
|
|
"ingredients": [
|
|
{"name": "메코발라민", "amount": "1mg", "role": "비타민B12"},
|
|
{"name": "UDCA", "amount": "60mg", "role": "간기능개선"},
|
|
{"name": "타우린", "amount": "100mg", "role": "피로회복"}
|
|
],
|
|
"tags_symptoms": ["피로", "구내염", "신경통", "근육통"],
|
|
"tags_ingredients": ["메코발라민 1mg", "UDCA 60mg", "타우린 100mg"],
|
|
"tags_effects": ["피로회복", "간기능개선", "신경계보호"],
|
|
"categories": [
|
|
{"name": "복합비타민", "score": 1.0},
|
|
{"name": "간영양제", "score": 0.9},
|
|
{"name": "피로회복제", "score": 1.0}
|
|
]
|
|
}
|
|
]
|
|
|
|
try:
|
|
for product in products:
|
|
# 1. product_master 삽입
|
|
cursor.execute("""
|
|
INSERT OR REPLACE INTO product_master
|
|
(barcode, product_name, manufacturer, drug_classification,
|
|
ingredients_json, tags_symptoms, tags_effects, tags_ingredients,
|
|
is_verified)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, 1)
|
|
""", (
|
|
product["barcode"],
|
|
product["product_name"],
|
|
product["manufacturer"],
|
|
product["drug_classification"],
|
|
json.dumps(product["ingredients"], ensure_ascii=False),
|
|
json.dumps(product["tags_symptoms"], ensure_ascii=False),
|
|
json.dumps(product["tags_effects"], ensure_ascii=False),
|
|
json.dumps(product["tags_ingredients"], ensure_ascii=False)
|
|
))
|
|
|
|
# 2. product_category_mapping 삽입
|
|
for cat in product["categories"]:
|
|
cursor.execute("""
|
|
INSERT OR REPLACE INTO product_category_mapping
|
|
(barcode, category_name, relevance_score)
|
|
VALUES (?, ?, ?)
|
|
""", (
|
|
product["barcode"],
|
|
cat["name"],
|
|
cat["score"]
|
|
))
|
|
|
|
conn.commit()
|
|
print("[OK] 샘플 제품 3개 추가 완료!")
|
|
|
|
# 결과 확인
|
|
cursor.execute("SELECT COUNT(*) FROM product_master")
|
|
count = cursor.fetchone()[0]
|
|
print(f"\n전체 제품 수: {count}개")
|
|
|
|
print("\n추가된 제품:")
|
|
cursor.execute("""
|
|
SELECT barcode, product_name, drug_classification
|
|
FROM product_master
|
|
""")
|
|
for row in cursor.fetchall():
|
|
print(f" - {row[0]}: {row[1]} ({row[2]})")
|
|
|
|
# 카테고리 매핑 확인
|
|
print("\n제품-카테고리 매핑:")
|
|
cursor.execute("""
|
|
SELECT p.product_name, m.category_name, m.relevance_score
|
|
FROM product_master p
|
|
JOIN product_category_mapping m ON p.barcode = m.barcode
|
|
ORDER BY p.product_name, m.relevance_score DESC
|
|
""")
|
|
for row in cursor.fetchall():
|
|
print(f" {row[0]:20} -> {row[1]:15} (관련도: {row[2]:.1f})")
|
|
|
|
except Exception as e:
|
|
print(f"[ERROR] {e}")
|
|
conn.rollback()
|
|
finally:
|
|
conn.close()
|
|
|
|
if __name__ == '__main__':
|
|
insert_sample_products()
|