From 8f962a988f3a28f15bafd966b3436334499b13f7 Mon Sep 17 00:00:00 2001 From: logan Date: Mon, 25 May 2026 01:45:37 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Redis=20target=5Fdatabase=E9=9A=94?= =?UTF-8?q?=E7=A6=BB=E4=BF=AE=E5=A4=8D=20-=20=5Fparse=5Fredis=5Fcommands?= =?UTF-8?q?=E4=BD=BF=E7=94=A8ticket.target=5Fdatabase=E4=BD=9C=E4=B8=BA?= =?UTF-8?q?=E9=BB=98=E8=AE=A4db=E7=BC=96=E5=8F=B7=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E7=AE=80=E5=8D=95=E6=96=87=E6=9C=AC=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=86=99=E6=AD=BBdb=3D0=E7=9A=84bug=EF=BC=8C=E7=A1=AE=E4=BF=9D?= =?UTF-8?q?=E5=B7=A5=E5=8D=95=E6=8F=90=E4=BA=A4=E5=88=B0db1=E6=97=B6?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=AD=A3=E7=A1=AE=E5=86=99=E5=85=A5db1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/api/v1/endpoints/ticket.py | 14 ++++++++++++-- backend/app/services/ticket_executor.py | 19 +++++++++++++------ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/backend/app/api/v1/endpoints/ticket.py b/backend/app/api/v1/endpoints/ticket.py index bf82fdd..be1438c 100644 --- a/backend/app/api/v1/endpoints/ticket.py +++ b/backend/app/api/v1/endpoints/ticket.py @@ -1094,12 +1094,17 @@ async def _send_ticket_notification( instance_name = await _get_instance_name(db, ticket.instance_id) sql_preview = ticket.sql_content[:100] + "..." if len(ticket.sql_content) > 100 else ticket.sql_content + # Redis database 格式化: "0" → "db0" + target_db = ticket.target_database or "" + if ticket.db_type == "redis" and target_db.isdigit(): + target_db = f"db{target_db}" + notification_data = { "title": ticket.title, "ticket_id": ticket.id, "ticket_no": ticket.ticket_no or str(ticket.id), "db_type": ticket.db_type, - "target_database": ticket.target_database or "", + "target_database": target_db, "instance_name": instance_name, "sql_preview": sql_preview, "applicant": applicant_name, @@ -1141,12 +1146,17 @@ async def _send_execution_notification( applicant_name = await _get_user_name(db, ticket.applicant_id) sql_preview = ticket.sql_content[:100] + "..." if len(ticket.sql_content) > 100 else ticket.sql_content + # Redis database 格式化: "0" → "db0" + target_db = ticket.target_database or "" + if ticket.db_type == "redis" and target_db.isdigit(): + target_db = f"db{target_db}" + notification_data = { "title": ticket.title, "ticket_id": ticket.id, "ticket_no": ticket.ticket_no or str(ticket.id), "db_type": ticket.db_type, - "target_database": ticket.target_database or "", + "target_database": target_db, "instance_name": instance_name, "sql_preview": sql_preview, "applicant": applicant_name, diff --git a/backend/app/services/ticket_executor.py b/backend/app/services/ticket_executor.py index 5c46a34..0d5757a 100644 --- a/backend/app/services/ticket_executor.py +++ b/backend/app/services/ticket_executor.py @@ -520,7 +520,7 @@ class TicketExecutor: try: # 解析命令 - commands = self._parse_redis_commands(ticket.sql_content) + commands = self._parse_redis_commands(ticket.sql_content, ticket.target_database) if not commands: report.status = "failed" report.errors.append("未解析到有效的 Redis 命令") @@ -1552,13 +1552,14 @@ class TicketExecutor: return row or 0 @staticmethod - def _parse_redis_commands(content: str) -> List[Dict[str, Any]]: + def _parse_redis_commands(content: str, target_database: str = "0") -> List[Dict[str, Any]]: """解析 Redis 工单内容为命令列表。 支持 JSON 格式和简单文本格式。 Args: content: 工单内容 + target_database: 目标 DB 编号(来自 ticket.target_database) Returns: 命令列表,每项为 {"command": str, "db": int} @@ -1567,6 +1568,12 @@ class TicketExecutor: if not content: return [] + # 解析默认 db 编号 + try: + default_db = int(target_database) + except (ValueError, TypeError): + default_db = 0 + # 尝试 JSON 解析 if content.startswith("{"): try: @@ -1577,14 +1584,14 @@ class TicketExecutor: if isinstance(cmd, dict) and "command" in cmd: commands.append({ "command": cmd["command"], - "db": cmd.get("db", 0), + "db": cmd.get("db", default_db), }) elif isinstance(cmd, str): - commands.append({"command": cmd, "db": 0}) + commands.append({"command": cmd, "db": default_db}) return commands # 可能是单条命令的 JSON if "command" in data: - return [{"command": data["command"], "db": data.get("db", 0)}] + return [{"command": data["command"], "db": data.get("db", default_db)}] except json.JSONDecodeError: pass # 不是 JSON,尝试文本格式 @@ -1593,7 +1600,7 @@ class TicketExecutor: for line in content.split("\n"): line = line.strip() if line and not line.startswith("#"): - commands.append({"command": line, "db": 0}) + commands.append({"command": line, "db": default_db}) return commands