linebot_pydantic_fastapi / debug_sql_query.py
mickeywu520's picture
修正查詢
85ef28f
"""
調試 SQL 查詢 - 檢查實際執行的 SQL
"""
def debug_sql_query():
"""調試 SQL 查詢邏輯"""
print("🔍 調試 SQL 查詢邏輯")
print("=" * 50)
# 模擬關鍵字
keywords = ['貓砂', '礦砂', '豆腐砂', '水晶砂', '木屑砂', 'litter', '貓']
print(f"關鍵字: {keywords}")
# 生成 SQL 查詢條件
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}")
# 組合完整的 SQL
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:
# 模擬 ILIKE '%keyword%' 邏輯
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)
# 模擬 SQLAlchemy OR 查詢
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:
# 檢查 productName
if keyword.lower() in product["productName"].lower():
conditions_met.append(f"productName contains '{keyword}'")
# 檢查 productCode
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()