From 5369d8d6e52162f8f6fe630423e14c897773390a Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 12 Aug 2026 11:01:03 +0800 Subject: [PATCH] =?UTF-8?q?fix(alerts):=20=E4=BF=AE=E5=A4=8D=E6=A3=80?= =?UTF-8?q?=E6=B5=8BIP=E5=86=B2=E7=AA=81=E6=97=B6=20db.func=20=E8=AF=AF?= =?UTF-8?q?=E7=94=A8=E5=AF=BC=E8=87=B4=E7=AB=8B=E5=8D=B3=E6=A3=80=E6=B5=8B?= =?UTF-8?q?500?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit detect_ip_conflicts 误用 db.func.count/db.func.distinct,而 func 是 SQLAlchemy 模块属性而非 Session 方法,触发 AttributeError 使 /alerts/detect/run 返回500(前端弹'请求失败')。 改为 from sqlalchemy import func 后使用 func.count/func.distinct --- backend/app/services/alert_service.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/app/services/alert_service.py b/backend/app/services/alert_service.py index c65bb10..7ad67e5 100644 --- a/backend/app/services/alert_service.py +++ b/backend/app/services/alert_service.py @@ -1,5 +1,6 @@ from typing import List, Dict, Any, Optional from sqlalchemy.orm import Session +from sqlalchemy import func from datetime import datetime, timedelta import logging import json @@ -80,7 +81,7 @@ class AlertService: subquery = db.query( ARPEntry.ip_address ).group_by(ARPEntry.ip_address).having( - db.func.count(db.func.distinct(ARPEntry.mac_address)) > 1 + func.count(func.distinct(ARPEntry.mac_address)) > 1 ).subquery() conflict_entries = db.query(ARPEntry).filter(