新增: - explain_preview.py: EXPLAIN预检服务(MySQL/PG), 影响行数预估, 全表扫描检测 - ticket.executor: 三种执行策略(stop_on_error/continue/transaction) - risk_evaluator: table_sizes参数, 大表ALTER/UPDATE/DELETE自动升级high - test_phase2_features.py: 22个测试(EXPLAIN+执行策略+大表检测) 简化: - 砍掉CTX-001上下文感知规则(复杂二次扫描), 合并大表检测到risk_evaluator - 审核引擎保持纯静态分析, 不再导入_RULE_REGISTRY做二次扫描 模型: - Ticket加exec_strategy字段 - TicketSqlItem模型 - schema加sql_type/exec_strategy/risk_level/workflow_id
61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
from datetime import datetime
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
from typing import Optional, Literal
|
|
|
|
|
|
class TicketCreate(BaseModel):
|
|
title: str = Field(..., min_length=5, max_length=200)
|
|
db_type: Literal["mysql", "postgres", "redis", "mongo"]
|
|
instance_id: int
|
|
target_database: str = Field(..., min_length=1)
|
|
sql_content: str = Field(..., min_length=1)
|
|
sql_type: Optional[str] = None
|
|
rollback_sql: Optional[str] = None
|
|
reason: str = Field(..., min_length=5)
|
|
priority: Literal["high", "medium", "low"] = "medium"
|
|
exec_strategy: Optional[str] = "stop_on_error"
|
|
scheduled_at: Optional[datetime] = None
|
|
|
|
|
|
class TicketReview(BaseModel):
|
|
action: Literal["approve", "reject"]
|
|
comment: str = Field(default="", max_length=500)
|
|
|
|
|
|
class TicketResponse(BaseModel):
|
|
id: int
|
|
ticket_no: Optional[str] = None
|
|
title: str
|
|
db_type: str
|
|
instance_id: int
|
|
instance_name: Optional[str] = None
|
|
target_database: str
|
|
sql_content: str
|
|
rollback_sql: Optional[str] = None
|
|
status: str
|
|
priority: str
|
|
risk_level: Optional[str] = "low"
|
|
workflow_id: Optional[int] = None
|
|
applicant_id: int
|
|
applicant_name: Optional[str] = None
|
|
approver_id: Optional[int] = None
|
|
approver_name: Optional[str] = None
|
|
current_approver_name: Optional[str] = None
|
|
reason: Optional[str] = None
|
|
audit_result: Optional[str] = None
|
|
execute_result: Optional[str] = None
|
|
create_time: datetime
|
|
review_time: Optional[datetime] = None
|
|
execute_time: Optional[datetime] = None
|
|
scheduled_at: Optional[datetime] = None
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
|
|
class TicketListParams(BaseModel):
|
|
page: int = 1
|
|
page_size: int = 10
|
|
status: Optional[str] = None
|
|
db_type: Optional[str] = None
|
|
keyword: Optional[str] = None
|