File size: 6,033 Bytes
85ef28f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
"""
調試 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()
|