linebot_pydantic_fastapi / test_database_connection.py
mickeywu520's picture
修正查詢
85ef28f
"""
測試資料庫連接和商品查詢
"""
import sys
import os
# 添加專案根目錄到 Python 路徑
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
def test_database_connection():
"""測試資料庫連接"""
try:
from backend.database.connection import get_database_session, close_database_session
from backend.database.models import Product, Category
from sqlalchemy.orm import joinedload
from sqlalchemy import text
print("🔗 測試資料庫連接...")
db = get_database_session()
if not db:
print("❌ 無法獲取資料庫連接")
return False
print("✅ 資料庫連接成功")
# 1. 測試原始 SQL 查詢
print("\n1. 測試原始 SQL 查詢...")
try:
result = db.execute(text("SELECT COUNT(*) as count FROM products WHERE is_deleted = false"))
count = result.fetchone()[0]
print(f" 商品總數 (SQL): {count}")
except Exception as e:
print(f" ❌ SQL 查詢失敗: {str(e)}")
return False
# 2. 測試 ORM 查詢
print("\n2. 測試 ORM 查詢...")
try:
products = db.query(Product).filter(Product.is_deleted == False).all()
print(f" 商品總數 (ORM): {len(products)}")
if products:
print(" 前3個商品:")
for i, product in enumerate(products[:3], 1):
print(f" {i}. {product.productName} (編號: {product.productCode}, 庫存: {product.stock})")
except Exception as e:
print(f" ❌ ORM 查詢失敗: {str(e)}")
import traceback
traceback.print_exc()
return False
# 3. 測試關聯查詢
print("\n3. 測試關聯查詢...")
try:
products_with_category = db.query(Product).options(
joinedload(Product.category)
).filter(Product.is_deleted == False).limit(3).all()
print(f" 關聯查詢成功,取得 {len(products_with_category)} 個商品")
for product in products_with_category:
category_name = product.category.name if product.category else "無分類"
print(f" - {product.productName} (分類: {category_name})")
except Exception as e:
print(f" ❌ 關聯查詢失敗: {str(e)}")
import traceback
traceback.print_exc()
return False
# 4. 測試貓砂相關商品查詢
print("\n4. 測試貓砂相關商品查詢...")
try:
from sqlalchemy import or_
keywords = ['貓砂', '礦砂', '貓']
search_filters = []
for keyword in keywords:
search_filters.extend([
Product.productName.ilike(f"%{keyword}%"),
Product.productCode.ilike(f"%{keyword}%")
])
cat_products = db.query(Product).filter(
Product.is_deleted == False
).filter(
or_(*search_filters)
).all()
print(f" 找到 {len(cat_products)} 個貓砂相關商品:")
for product in cat_products:
print(f" ✅ {product.productName} (庫存: {product.stock})")
except Exception as e:
print(f" ❌ 貓砂查詢失敗: {str(e)}")
import traceback
traceback.print_exc()
return False
close_database_session(db)
return True
except Exception as e:
print(f"❌ 資料庫測試失敗: {str(e)}")
import traceback
traceback.print_exc()
return False
def test_enhanced_product_service():
"""測試 Enhanced Product Service"""
try:
from backend.services.enhanced_product_service import EnhancedProductService
print("\n🛍️ 測試 Enhanced Product Service...")
service = EnhancedProductService()
# 測試推薦查詢
print("\n測試推薦查詢: '貓砂還有嗎?'")
result = service.get_product_recommendations(
query_text="貓砂還有嗎?",
limit=5
)
print(f"查詢結果:")
print(f" 成功: {result.success}")
print(f" 數量: {result.count}")
print(f" 錯誤: {result.error}")
if result.success and result.data:
print(f" 找到的商品:")
for item in result.data:
print(f" - {item.get('product_name')} (庫存: {item.get('current_stock')})")
return result.success
except Exception as e:
print(f"❌ Enhanced Product Service 測試失敗: {str(e)}")
import traceback
traceback.print_exc()
return False
def test_pydantic_ai_service():
"""測試 Pydantic AI Service"""
try:
from backend.services.pydantic_ai_service import ProductQueryService
print("\n🤖 測試 Pydantic AI Service...")
service = ProductQueryService()
if not service.is_available():
print("⚠️ Pydantic AI 服務不可用 (可能缺少 GROQ_API_KEY)")
return False
# 測試同步查詢
print("\n測試同步查詢: '貓砂還有嗎?'")
result = service.process_product_query_sync(
user_message="貓砂還有嗎?",
user_id="test_user"
)
print(f"查詢結果:")
print(f" 成功: {result.get('success')}")
print(f" 模式: {result.get('mode')}")
print(f" 錯誤: {result.get('error')}")
print(f" 回應: {result.get('text', '')[:100]}...")
return result.get('success', False)
except Exception as e:
print(f"❌ Pydantic AI Service 測試失敗: {str(e)}")
import traceback
traceback.print_exc()
return False
def main():
"""主函數"""
print("🚀 開始資料庫連接和服務測試")
print("=" * 60)
# 1. 測試資料庫連接
db_success = test_database_connection()
if not db_success:
print("\n❌ 資料庫連接測試失敗,停止後續測試")
return
# 2. 測試 Enhanced Product Service
service_success = test_enhanced_product_service()
# 3. 測試 Pydantic AI Service
ai_success = test_pydantic_ai_service()
print("\n" + "=" * 60)
print("📊 測試結果總結:")
print(f" 資料庫連接: {'✅ 成功' if db_success else '❌ 失敗'}")
print(f" Enhanced Product Service: {'✅ 成功' if service_success else '❌ 失敗'}")
print(f" Pydantic AI Service: {'✅ 成功' if ai_success else '❌ 失敗'}")
if db_success and service_success:
print("\n💡 如果服務測試成功但 LineBot 仍然沒有回應,問題可能在於:")
print(" 1. LineBot 路由邏輯")
print(" 2. 回應格式化")
print(" 3. LINE API 回應")
if __name__ == "__main__":
main()