fix: auto-fix code issues (cron)
- 修复重复导入/字段 - 修复异常处理 - 修复PEP8格式问题 (816+ 处) - 添加缺失的导入 (json, re) - 统一SQL查询格式 - 修复赋值语句空格问题 修复文件: - db_manager.py (96处) - search_manager.py (77处) - ops_manager.py (66处) - developer_ecosystem_manager.py (68处) - growth_manager.py (60处) - enterprise_manager.py (61处) - tenant_manager.py (57处) - plugin_manager.py (48处) - subscription_manager.py (46处) - security_manager.py (29处) - workflow_manager.py (32处) - localization_manager.py (31处) - api_key_manager.py (20处) - ai_manager.py (23处) - performance_manager.py (24处) - neo4j_manager.py (25处) - collaboration_manager.py (33处) - test_phase8_task8.py (16处) - test_phase8_task6.py (4处) - knowledge_reasoner.py (添加import json) - llm_client.py (添加import json)
This commit is contained in:
@@ -549,7 +549,7 @@ class OpsManager:
|
||||
def get_alert_rule(self, rule_id: str) -> AlertRule | None:
|
||||
"""获取告警规则"""
|
||||
with self._get_db() as conn:
|
||||
row = conn.execute("SELECT * FROM alert_rules WHERE id = ?", (rule_id,)).fetchone()
|
||||
row = conn.execute("SELECT * FROM alert_rules WHERE id = ?", (rule_id,)).fetchone()
|
||||
|
||||
if row:
|
||||
return self._row_to_alert_rule(row)
|
||||
@@ -557,7 +557,7 @@ class OpsManager:
|
||||
|
||||
def list_alert_rules(self, tenant_id: str, is_enabled: bool | None = None) -> list[AlertRule]:
|
||||
"""列出租户的所有告警规则"""
|
||||
query = "SELECT * FROM alert_rules WHERE tenant_id = ?"
|
||||
query = "SELECT * FROM alert_rules WHERE tenant_id = ?"
|
||||
params = [tenant_id]
|
||||
|
||||
if is_enabled is not None:
|
||||
@@ -606,7 +606,7 @@ class OpsManager:
|
||||
with self._get_db() as conn:
|
||||
set_clause = ", ".join([f"{k} = ?" for k in updates.keys()])
|
||||
conn.execute(
|
||||
f"UPDATE alert_rules SET {set_clause} WHERE id = ?",
|
||||
f"UPDATE alert_rules SET {set_clause} WHERE id = ?",
|
||||
list(updates.values()) + [rule_id],
|
||||
)
|
||||
conn.commit()
|
||||
@@ -616,7 +616,7 @@ class OpsManager:
|
||||
def delete_alert_rule(self, rule_id: str) -> bool:
|
||||
"""删除告警规则"""
|
||||
with self._get_db() as conn:
|
||||
conn.execute("DELETE FROM alert_rules WHERE id = ?", (rule_id,))
|
||||
conn.execute("DELETE FROM alert_rules WHERE id = ?", (rule_id,))
|
||||
conn.commit()
|
||||
return conn.total_changes > 0
|
||||
|
||||
@@ -680,7 +680,7 @@ class OpsManager:
|
||||
"""获取告警渠道"""
|
||||
with self._get_db() as conn:
|
||||
row = conn.execute(
|
||||
"SELECT * FROM alert_channels WHERE id = ?", (channel_id,)
|
||||
"SELECT * FROM alert_channels WHERE id = ?", (channel_id,)
|
||||
).fetchone()
|
||||
|
||||
if row:
|
||||
@@ -691,7 +691,7 @@ class OpsManager:
|
||||
"""列出租户的所有告警渠道"""
|
||||
with self._get_db() as conn:
|
||||
rows = conn.execute(
|
||||
"SELECT * FROM alert_channels WHERE tenant_id = ? ORDER BY created_at DESC",
|
||||
"SELECT * FROM alert_channels WHERE tenant_id = ? ORDER BY created_at DESC",
|
||||
(tenant_id,),
|
||||
).fetchall()
|
||||
return [self._row_to_alert_channel(row) for row in rows]
|
||||
@@ -1208,7 +1208,7 @@ class OpsManager:
|
||||
with self._get_db() as conn:
|
||||
row = conn.execute(
|
||||
"""SELECT * FROM alerts
|
||||
WHERE rule_id = ? AND status = ?
|
||||
WHERE rule_id = ? AND status = ?
|
||||
ORDER BY started_at DESC LIMIT 1""",
|
||||
(rule_id, AlertStatus.FIRING.value),
|
||||
).fetchone()
|
||||
@@ -1220,7 +1220,7 @@ class OpsManager:
|
||||
def get_alert(self, alert_id: str) -> Alert | None:
|
||||
"""获取告警详情"""
|
||||
with self._get_db() as conn:
|
||||
row = conn.execute("SELECT * FROM alerts WHERE id = ?", (alert_id,)).fetchone()
|
||||
row = conn.execute("SELECT * FROM alerts WHERE id = ?", (alert_id,)).fetchone()
|
||||
|
||||
if row:
|
||||
return self._row_to_alert(row)
|
||||
@@ -1234,14 +1234,14 @@ class OpsManager:
|
||||
limit: int = 100,
|
||||
) -> list[Alert]:
|
||||
"""列出租户的告警"""
|
||||
query = "SELECT * FROM alerts WHERE tenant_id = ?"
|
||||
query = "SELECT * FROM alerts WHERE tenant_id = ?"
|
||||
params = [tenant_id]
|
||||
|
||||
if status:
|
||||
query += " AND status = ?"
|
||||
query += " AND status = ?"
|
||||
params.append(status.value)
|
||||
if severity:
|
||||
query += " AND severity = ?"
|
||||
query += " AND severity = ?"
|
||||
params.append(severity.value)
|
||||
|
||||
query += " ORDER BY started_at DESC LIMIT ?"
|
||||
@@ -1259,8 +1259,8 @@ class OpsManager:
|
||||
conn.execute(
|
||||
"""
|
||||
UPDATE alerts
|
||||
SET status = ?, acknowledged_by = ?, acknowledged_at = ?
|
||||
WHERE id = ?
|
||||
SET status = ?, acknowledged_by = ?, acknowledged_at = ?
|
||||
WHERE id = ?
|
||||
""",
|
||||
(AlertStatus.ACKNOWLEDGED.value, user_id, now, alert_id),
|
||||
)
|
||||
@@ -1276,8 +1276,8 @@ class OpsManager:
|
||||
conn.execute(
|
||||
"""
|
||||
UPDATE alerts
|
||||
SET status = ?, resolved_at = ?
|
||||
WHERE id = ?
|
||||
SET status = ?, resolved_at = ?
|
||||
WHERE id = ?
|
||||
""",
|
||||
(AlertStatus.RESOLVED.value, now, alert_id),
|
||||
)
|
||||
@@ -1291,8 +1291,8 @@ class OpsManager:
|
||||
conn.execute(
|
||||
"""
|
||||
UPDATE alerts
|
||||
SET suppression_count = suppression_count + 1
|
||||
WHERE id = ?
|
||||
SET suppression_count = suppression_count + 1
|
||||
WHERE id = ?
|
||||
""",
|
||||
(alert_id,),
|
||||
)
|
||||
@@ -1304,7 +1304,7 @@ class OpsManager:
|
||||
"""更新告警通知状态"""
|
||||
with self._get_db() as conn:
|
||||
row = conn.execute(
|
||||
"SELECT notification_sent FROM alerts WHERE id = ?", (alert_id,)
|
||||
"SELECT notification_sent FROM alerts WHERE id = ?", (alert_id,)
|
||||
).fetchone()
|
||||
|
||||
if row:
|
||||
@@ -1312,7 +1312,7 @@ class OpsManager:
|
||||
notification_sent[channel_id] = success
|
||||
|
||||
conn.execute(
|
||||
"UPDATE alerts SET notification_sent = ? WHERE id = ?",
|
||||
"UPDATE alerts SET notification_sent = ? WHERE id = ?",
|
||||
(json.dumps(notification_sent), alert_id),
|
||||
)
|
||||
conn.commit()
|
||||
@@ -1326,8 +1326,8 @@ class OpsManager:
|
||||
conn.execute(
|
||||
"""
|
||||
UPDATE alert_channels
|
||||
SET success_count = success_count + 1, last_used_at = ?
|
||||
WHERE id = ?
|
||||
SET success_count = success_count + 1, last_used_at = ?
|
||||
WHERE id = ?
|
||||
""",
|
||||
(now, channel_id),
|
||||
)
|
||||
@@ -1335,8 +1335,8 @@ class OpsManager:
|
||||
conn.execute(
|
||||
"""
|
||||
UPDATE alert_channels
|
||||
SET fail_count = fail_count + 1, last_used_at = ?
|
||||
WHERE id = ?
|
||||
SET fail_count = fail_count + 1, last_used_at = ?
|
||||
WHERE id = ?
|
||||
""",
|
||||
(now, channel_id),
|
||||
)
|
||||
@@ -1394,7 +1394,7 @@ class OpsManager:
|
||||
"""检查告警是否被抑制"""
|
||||
with self._get_db() as conn:
|
||||
rows = conn.execute(
|
||||
"SELECT * FROM alert_suppression_rules WHERE tenant_id = ?", (rule.tenant_id,)
|
||||
"SELECT * FROM alert_suppression_rules WHERE tenant_id = ?", (rule.tenant_id,)
|
||||
).fetchall()
|
||||
|
||||
for row in rows:
|
||||
@@ -1487,7 +1487,7 @@ class OpsManager:
|
||||
with self._get_db() as conn:
|
||||
rows = conn.execute(
|
||||
"""SELECT * FROM resource_metrics
|
||||
WHERE tenant_id = ? AND metric_name = ? AND timestamp > ?
|
||||
WHERE tenant_id = ? AND metric_name = ? AND timestamp > ?
|
||||
ORDER BY timestamp DESC""",
|
||||
(tenant_id, metric_name, cutoff_time),
|
||||
).fetchall()
|
||||
@@ -1507,8 +1507,8 @@ class OpsManager:
|
||||
with self._get_db() as conn:
|
||||
rows = conn.execute(
|
||||
"""SELECT * FROM resource_metrics
|
||||
WHERE tenant_id = ? AND resource_type = ? AND resource_id = ?
|
||||
AND metric_name = ? AND timestamp BETWEEN ? AND ?
|
||||
WHERE tenant_id = ? AND resource_type = ? AND resource_id = ?
|
||||
AND metric_name = ? AND timestamp BETWEEN ? AND ?
|
||||
ORDER BY timestamp ASC""",
|
||||
(tenant_id, resource_type.value, resource_id, metric_name, start_time, end_time),
|
||||
).fetchall()
|
||||
@@ -1626,7 +1626,7 @@ class OpsManager:
|
||||
"""获取容量规划列表"""
|
||||
with self._get_db() as conn:
|
||||
rows = conn.execute(
|
||||
"SELECT * FROM capacity_plans WHERE tenant_id = ? ORDER BY created_at DESC",
|
||||
"SELECT * FROM capacity_plans WHERE tenant_id = ? ORDER BY created_at DESC",
|
||||
(tenant_id,),
|
||||
).fetchall()
|
||||
return [self._row_to_capacity_plan(row) for row in rows]
|
||||
@@ -1704,7 +1704,7 @@ class OpsManager:
|
||||
"""获取自动扩缩容策略"""
|
||||
with self._get_db() as conn:
|
||||
row = conn.execute(
|
||||
"SELECT * FROM auto_scaling_policies WHERE id = ?", (policy_id,)
|
||||
"SELECT * FROM auto_scaling_policies WHERE id = ?", (policy_id,)
|
||||
).fetchone()
|
||||
|
||||
if row:
|
||||
@@ -1715,7 +1715,7 @@ class OpsManager:
|
||||
"""列出租户的自动扩缩容策略"""
|
||||
with self._get_db() as conn:
|
||||
rows = conn.execute(
|
||||
"SELECT * FROM auto_scaling_policies WHERE tenant_id = ? ORDER BY created_at DESC",
|
||||
"SELECT * FROM auto_scaling_policies WHERE tenant_id = ? ORDER BY created_at DESC",
|
||||
(tenant_id,),
|
||||
).fetchall()
|
||||
return [self._row_to_auto_scaling_policy(row) for row in rows]
|
||||
@@ -1816,7 +1816,7 @@ class OpsManager:
|
||||
with self._get_db() as conn:
|
||||
row = conn.execute(
|
||||
"""SELECT * FROM scaling_events
|
||||
WHERE policy_id = ?
|
||||
WHERE policy_id = ?
|
||||
ORDER BY started_at DESC LIMIT 1""",
|
||||
(policy_id,),
|
||||
).fetchone()
|
||||
@@ -1836,8 +1836,8 @@ class OpsManager:
|
||||
conn.execute(
|
||||
"""
|
||||
UPDATE scaling_events
|
||||
SET status = ?, completed_at = ?, error_message = ?
|
||||
WHERE id = ?
|
||||
SET status = ?, completed_at = ?, error_message = ?
|
||||
WHERE id = ?
|
||||
""",
|
||||
(status, now, error_message, event_id),
|
||||
)
|
||||
@@ -1845,8 +1845,8 @@ class OpsManager:
|
||||
conn.execute(
|
||||
"""
|
||||
UPDATE scaling_events
|
||||
SET status = ?, error_message = ?
|
||||
WHERE id = ?
|
||||
SET status = ?, error_message = ?
|
||||
WHERE id = ?
|
||||
""",
|
||||
(status, error_message, event_id),
|
||||
)
|
||||
@@ -1857,7 +1857,7 @@ class OpsManager:
|
||||
def get_scaling_event(self, event_id: str) -> ScalingEvent | None:
|
||||
"""获取扩缩容事件"""
|
||||
with self._get_db() as conn:
|
||||
row = conn.execute("SELECT * FROM scaling_events WHERE id = ?", (event_id,)).fetchone()
|
||||
row = conn.execute("SELECT * FROM scaling_events WHERE id = ?", (event_id,)).fetchone()
|
||||
|
||||
if row:
|
||||
return self._row_to_scaling_event(row)
|
||||
@@ -1867,11 +1867,11 @@ class OpsManager:
|
||||
self, tenant_id: str, policy_id: str = None, limit: int = 100
|
||||
) -> list[ScalingEvent]:
|
||||
"""列出租户的扩缩容事件"""
|
||||
query = "SELECT * FROM scaling_events WHERE tenant_id = ?"
|
||||
query = "SELECT * FROM scaling_events WHERE tenant_id = ?"
|
||||
params = [tenant_id]
|
||||
|
||||
if policy_id:
|
||||
query += " AND policy_id = ?"
|
||||
query += " AND policy_id = ?"
|
||||
params.append(policy_id)
|
||||
|
||||
query += " ORDER BY started_at DESC LIMIT ?"
|
||||
@@ -1951,7 +1951,7 @@ class OpsManager:
|
||||
def get_health_check(self, check_id: str) -> HealthCheck | None:
|
||||
"""获取健康检查配置"""
|
||||
with self._get_db() as conn:
|
||||
row = conn.execute("SELECT * FROM health_checks WHERE id = ?", (check_id,)).fetchone()
|
||||
row = conn.execute("SELECT * FROM health_checks WHERE id = ?", (check_id,)).fetchone()
|
||||
|
||||
if row:
|
||||
return self._row_to_health_check(row)
|
||||
@@ -1961,7 +1961,7 @@ class OpsManager:
|
||||
"""列出租户的健康检查"""
|
||||
with self._get_db() as conn:
|
||||
rows = conn.execute(
|
||||
"SELECT * FROM health_checks WHERE tenant_id = ? ORDER BY created_at DESC",
|
||||
"SELECT * FROM health_checks WHERE tenant_id = ? ORDER BY created_at DESC",
|
||||
(tenant_id,),
|
||||
).fetchall()
|
||||
return [self._row_to_health_check(row) for row in rows]
|
||||
@@ -2084,7 +2084,7 @@ class OpsManager:
|
||||
with self._get_db() as conn:
|
||||
rows = conn.execute(
|
||||
"""SELECT * FROM health_check_results
|
||||
WHERE check_id = ?
|
||||
WHERE check_id = ?
|
||||
ORDER BY checked_at DESC LIMIT ?""",
|
||||
(check_id, limit),
|
||||
).fetchall()
|
||||
@@ -2153,7 +2153,7 @@ class OpsManager:
|
||||
"""获取故障转移配置"""
|
||||
with self._get_db() as conn:
|
||||
row = conn.execute(
|
||||
"SELECT * FROM failover_configs WHERE id = ?", (config_id,)
|
||||
"SELECT * FROM failover_configs WHERE id = ?", (config_id,)
|
||||
).fetchone()
|
||||
|
||||
if row:
|
||||
@@ -2164,7 +2164,7 @@ class OpsManager:
|
||||
"""列出租户的故障转移配置"""
|
||||
with self._get_db() as conn:
|
||||
rows = conn.execute(
|
||||
"SELECT * FROM failover_configs WHERE tenant_id = ? ORDER BY created_at DESC",
|
||||
"SELECT * FROM failover_configs WHERE tenant_id = ? ORDER BY created_at DESC",
|
||||
(tenant_id,),
|
||||
).fetchall()
|
||||
return [self._row_to_failover_config(row) for row in rows]
|
||||
@@ -2228,8 +2228,8 @@ class OpsManager:
|
||||
conn.execute(
|
||||
"""
|
||||
UPDATE failover_events
|
||||
SET status = ?, completed_at = ?
|
||||
WHERE id = ?
|
||||
SET status = ?, completed_at = ?
|
||||
WHERE id = ?
|
||||
""",
|
||||
(status, now, event_id),
|
||||
)
|
||||
@@ -2237,8 +2237,8 @@ class OpsManager:
|
||||
conn.execute(
|
||||
"""
|
||||
UPDATE failover_events
|
||||
SET status = ?, rolled_back_at = ?
|
||||
WHERE id = ?
|
||||
SET status = ?, rolled_back_at = ?
|
||||
WHERE id = ?
|
||||
""",
|
||||
(status, now, event_id),
|
||||
)
|
||||
@@ -2246,8 +2246,8 @@ class OpsManager:
|
||||
conn.execute(
|
||||
"""
|
||||
UPDATE failover_events
|
||||
SET status = ?
|
||||
WHERE id = ?
|
||||
SET status = ?
|
||||
WHERE id = ?
|
||||
""",
|
||||
(status, event_id),
|
||||
)
|
||||
@@ -2259,7 +2259,7 @@ class OpsManager:
|
||||
"""获取故障转移事件"""
|
||||
with self._get_db() as conn:
|
||||
row = conn.execute(
|
||||
"SELECT * FROM failover_events WHERE id = ?", (event_id,)
|
||||
"SELECT * FROM failover_events WHERE id = ?", (event_id,)
|
||||
).fetchone()
|
||||
|
||||
if row:
|
||||
@@ -2271,7 +2271,7 @@ class OpsManager:
|
||||
with self._get_db() as conn:
|
||||
rows = conn.execute(
|
||||
"""SELECT * FROM failover_events
|
||||
WHERE tenant_id = ?
|
||||
WHERE tenant_id = ?
|
||||
ORDER BY started_at DESC LIMIT ?""",
|
||||
(tenant_id, limit),
|
||||
).fetchall()
|
||||
@@ -2346,7 +2346,7 @@ class OpsManager:
|
||||
def get_backup_job(self, job_id: str) -> BackupJob | None:
|
||||
"""获取备份任务"""
|
||||
with self._get_db() as conn:
|
||||
row = conn.execute("SELECT * FROM backup_jobs WHERE id = ?", (job_id,)).fetchone()
|
||||
row = conn.execute("SELECT * FROM backup_jobs WHERE id = ?", (job_id,)).fetchone()
|
||||
|
||||
if row:
|
||||
return self._row_to_backup_job(row)
|
||||
@@ -2356,7 +2356,7 @@ class OpsManager:
|
||||
"""列出租户的备份任务"""
|
||||
with self._get_db() as conn:
|
||||
rows = conn.execute(
|
||||
"SELECT * FROM backup_jobs WHERE tenant_id = ? ORDER BY created_at DESC",
|
||||
"SELECT * FROM backup_jobs WHERE tenant_id = ? ORDER BY created_at DESC",
|
||||
(tenant_id,),
|
||||
).fetchall()
|
||||
return [self._row_to_backup_job(row) for row in rows]
|
||||
@@ -2419,8 +2419,8 @@ class OpsManager:
|
||||
conn.execute(
|
||||
"""
|
||||
UPDATE backup_records
|
||||
SET status = ?, size_bytes = ?, checksum = ?, completed_at = ?
|
||||
WHERE id = ?
|
||||
SET status = ?, size_bytes = ?, checksum = ?, completed_at = ?
|
||||
WHERE id = ?
|
||||
""",
|
||||
(BackupStatus.COMPLETED.value, size_bytes, checksum, now, record_id),
|
||||
)
|
||||
@@ -2430,7 +2430,7 @@ class OpsManager:
|
||||
"""获取备份记录"""
|
||||
with self._get_db() as conn:
|
||||
row = conn.execute(
|
||||
"SELECT * FROM backup_records WHERE id = ?", (record_id,)
|
||||
"SELECT * FROM backup_records WHERE id = ?", (record_id,)
|
||||
).fetchone()
|
||||
|
||||
if row:
|
||||
@@ -2441,11 +2441,11 @@ class OpsManager:
|
||||
self, tenant_id: str, job_id: str = None, limit: int = 100
|
||||
) -> list[BackupRecord]:
|
||||
"""列出租户的备份记录"""
|
||||
query = "SELECT * FROM backup_records WHERE tenant_id = ?"
|
||||
query = "SELECT * FROM backup_records WHERE tenant_id = ?"
|
||||
params = [tenant_id]
|
||||
|
||||
if job_id:
|
||||
query += " AND job_id = ?"
|
||||
query += " AND job_id = ?"
|
||||
params.append(job_id)
|
||||
|
||||
query += " ORDER BY started_at DESC LIMIT ?"
|
||||
@@ -2630,7 +2630,7 @@ class OpsManager:
|
||||
with self._get_db() as conn:
|
||||
rows = conn.execute(
|
||||
"""SELECT * FROM resource_utilizations
|
||||
WHERE tenant_id = ? AND report_date LIKE ?
|
||||
WHERE tenant_id = ? AND report_date LIKE ?
|
||||
ORDER BY report_date DESC""",
|
||||
(tenant_id, f"{report_period}%"),
|
||||
).fetchall()
|
||||
@@ -2647,7 +2647,7 @@ class OpsManager:
|
||||
"""SELECT resource_type, resource_id, AVG(utilization_rate) as avg_utilization,
|
||||
MAX(idle_time_percent) as max_idle_time
|
||||
FROM resource_utilizations
|
||||
WHERE tenant_id = ? AND report_date > ?
|
||||
WHERE tenant_id = ? AND report_date > ?
|
||||
GROUP BY resource_type, resource_id
|
||||
HAVING avg_utilization < 0.1 AND max_idle_time > 0.8""",
|
||||
(tenant_id, thirty_days_ago),
|
||||
@@ -2703,7 +2703,7 @@ class OpsManager:
|
||||
"""获取闲置资源列表"""
|
||||
with self._get_db() as conn:
|
||||
rows = conn.execute(
|
||||
"SELECT * FROM idle_resources WHERE tenant_id = ? ORDER BY detected_at DESC",
|
||||
"SELECT * FROM idle_resources WHERE tenant_id = ? ORDER BY detected_at DESC",
|
||||
(tenant_id,),
|
||||
).fetchall()
|
||||
return [self._row_to_idle_resource(row) for row in rows]
|
||||
@@ -2780,11 +2780,11 @@ class OpsManager:
|
||||
self, tenant_id: str, is_applied: bool = None
|
||||
) -> list[CostOptimizationSuggestion]:
|
||||
"""获取成本优化建议"""
|
||||
query = "SELECT * FROM cost_optimization_suggestions WHERE tenant_id = ?"
|
||||
query = "SELECT * FROM cost_optimization_suggestions WHERE tenant_id = ?"
|
||||
params = [tenant_id]
|
||||
|
||||
if is_applied is not None:
|
||||
query += " AND is_applied = ?"
|
||||
query += " AND is_applied = ?"
|
||||
params.append(1 if is_applied else 0)
|
||||
|
||||
query += " ORDER BY potential_savings DESC"
|
||||
@@ -2803,8 +2803,8 @@ class OpsManager:
|
||||
conn.execute(
|
||||
"""
|
||||
UPDATE cost_optimization_suggestions
|
||||
SET is_applied = ?, applied_at = ?
|
||||
WHERE id = ?
|
||||
SET is_applied = ?, applied_at = ?
|
||||
WHERE id = ?
|
||||
""",
|
||||
(True, now, suggestion_id),
|
||||
)
|
||||
@@ -2818,7 +2818,7 @@ class OpsManager:
|
||||
"""获取成本优化建议详情"""
|
||||
with self._get_db() as conn:
|
||||
row = conn.execute(
|
||||
"SELECT * FROM cost_optimization_suggestions WHERE id = ?", (suggestion_id,)
|
||||
"SELECT * FROM cost_optimization_suggestions WHERE id = ?", (suggestion_id,)
|
||||
).fetchone()
|
||||
|
||||
if row:
|
||||
|
||||
Reference in New Issue
Block a user