|
""" |
|
調試 SQL 查詢 - 檢查實際執行的 SQL |
|
""" |
|
|
|
def debug_sql_query(): |
|
"""調試 SQL 查詢邏輯""" |
|
|
|
print("🔍 調試 SQL 查詢邏輯") |
|
print("=" * 50) |
|
|
|
|
|
keywords = ['貓砂', '礦砂', '豆腐砂', '水晶砂', '木屑砂', 'litter', '貓'] |
|
|
|
print(f"關鍵字: {keywords}") |
|
|
|
|
|
search_conditions = [] |
|
|
|
for keyword in keywords: |
|
search_conditions.extend([ |
|
f"productName ILIKE '%{keyword}%'", |
|
f"productCode ILIKE '%{keyword}%'", |
|
f"barcode ILIKE '%{keyword}%'" |
|
]) |
|
|
|
print(f"\n生成的搜尋條件數量: {len(search_conditions)}") |
|
print("前10個條件:") |
|
for i, condition in enumerate(search_conditions[:10], 1): |
|
print(f" {i}. {condition}") |
|
|
|
|
|
where_clause = " OR ".join(search_conditions) |
|
full_sql = f""" |
|
SELECT id, productCode, productName, stock, warehouse, category_id |
|
FROM products |
|
WHERE is_deleted = false |
|
AND ({where_clause}) |
|
ORDER BY stock DESC |
|
LIMIT 5; |
|
""" |
|
|
|
print(f"\n完整 SQL 查詢:") |
|
print(full_sql) |
|
|
|
|
|
print(f"\n🛍️ 測試與實際商品的匹配") |
|
print("=" * 50) |
|
|
|
|
|
products = [ |
|
{ |
|
"id": 1, |
|
"productCode": "OL1100-1", |
|
"productName": "毆力天然犬種300g 室內成犬無榖小顆粒", |
|
"stock": 100 |
|
}, |
|
{ |
|
"id": 2, |
|
"productCode": "SW-06-01", |
|
"productName": "Shovel well豪好鏟 破碎型礦砂", |
|
"stock": 50 |
|
}, |
|
{ |
|
"id": 3, |
|
"productCode": "TL-03", |
|
"productName": "美國極冠貓砂 薰衣草12kg", |
|
"stock": 48 |
|
}, |
|
{ |
|
"id": 4, |
|
"productCode": "SL11002", |
|
"productName": "首領汪 膠原鴨舌 5入彭湃包", |
|
"stock": 100 |
|
} |
|
] |
|
|
|
matched_products = [] |
|
|
|
for product in products: |
|
product_name = product["productName"].lower() |
|
product_code = product["productCode"].lower() |
|
|
|
|
|
for keyword in keywords: |
|
keyword_lower = keyword.lower() |
|
|
|
if (keyword_lower in product_name or |
|
keyword_lower in product_code): |
|
matched_products.append({ |
|
"product": product, |
|
"matched_keyword": keyword |
|
}) |
|
print(f"✅ 匹配: {product['productName']} (關鍵字: '{keyword}')") |
|
break |
|
|
|
print(f"\n總共匹配 {len(matched_products)} 個商品") |
|
|
|
if not matched_products: |
|
print("❌ 沒有匹配的商品") |
|
|
|
|
|
print("\n🔍 逐個測試關鍵字:") |
|
for keyword in keywords: |
|
print(f"\n關鍵字: '{keyword}'") |
|
found = False |
|
for product in products: |
|
if keyword.lower() in product["productName"].lower(): |
|
print(f" ✅ 匹配商品: {product['productName']}") |
|
found = True |
|
if not found: |
|
print(f" ❌ 無匹配商品") |
|
|
|
def debug_ilike_logic(): |
|
"""調試 ILIKE 邏輯""" |
|
|
|
print(f"\n🔍 調試 ILIKE 邏輯") |
|
print("=" * 50) |
|
|
|
|
|
test_strings = [ |
|
"美國極冠貓砂 薰衣草12kg", |
|
"Shovel well豪好鏟 破碎型礦砂", |
|
"毆力天然犬種300g 室內成犬無榖小顆粒", |
|
"首領汪 膠原鴨舌 5入彭湃包" |
|
] |
|
|
|
|
|
test_keywords = ["貓砂", "礦砂", "貓", "狗", "犬"] |
|
|
|
print("ILIKE 匹配測試:") |
|
for keyword in test_keywords: |
|
print(f"\n關鍵字: '{keyword}'") |
|
for string in test_strings: |
|
|
|
if keyword.lower() in string.lower(): |
|
print(f" ✅ '{string}' 包含 '{keyword}'") |
|
else: |
|
print(f" ❌ '{string}' 不包含 '{keyword}'") |
|
|
|
def debug_or_logic(): |
|
"""調試 OR 邏輯""" |
|
|
|
print(f"\n🔍 調試 OR 邏輯") |
|
print("=" * 50) |
|
|
|
|
|
products = [ |
|
{"productName": "美國極冠貓砂 薰衣草12kg", "productCode": "TL-03"}, |
|
{"productName": "Shovel well豪好鏟 破碎型礦砂", "productCode": "SW-06-01"}, |
|
{"productName": "毆力天然犬種300g 室內成犬無榖小顆粒", "productCode": "OL1100-1"}, |
|
{"productName": "首領汪 膠原鴨舌 5入彭湃包", "productCode": "SL11002"} |
|
] |
|
|
|
keywords = ['貓砂', '礦砂'] |
|
|
|
print(f"使用關鍵字: {keywords}") |
|
print("OR 邏輯測試:") |
|
|
|
for product in products: |
|
conditions_met = [] |
|
|
|
for keyword in keywords: |
|
|
|
if keyword.lower() in product["productName"].lower(): |
|
conditions_met.append(f"productName contains '{keyword}'") |
|
|
|
|
|
if keyword.lower() in product["productCode"].lower(): |
|
conditions_met.append(f"productCode contains '{keyword}'") |
|
|
|
if conditions_met: |
|
print(f" ✅ {product['productName']}") |
|
print(f" 滿足條件: {', '.join(conditions_met)}") |
|
else: |
|
print(f" ❌ {product['productName']} (無匹配)") |
|
|
|
def main(): |
|
"""主函數""" |
|
print("🚀 開始 SQL 查詢調試") |
|
print("=" * 60) |
|
|
|
debug_sql_query() |
|
debug_ilike_logic() |
|
debug_or_logic() |
|
|
|
print("\n" + "=" * 60) |
|
print("✅ SQL 調試完成!") |
|
print("\n💡 如果邏輯測試都正確,問題可能在於:") |
|
print("1. 資料庫連接問題") |
|
print("2. SQLAlchemy 查詢執行問題") |
|
print("3. 事務或會話問題") |
|
print("4. 權限問題") |
|
|
|
if __name__ == "__main__": |
|
main() |
|
|