fix: policy 加载 bug + DB 索引 + 归档脚本
【Bug 修复】policy.py _load_db_or_yaml
根因: select(PolicyVersion).order_by(desc).scalar_one_or_none()
表有多条历史版本 → Multiple rows 异常 → 每次启动都回退 YAML
修复: 改成 db.query(PolicyVersion).order_by(desc).first()
用 ORM Query API 取最新一条, 返回真正的 PolicyVersion 对象
验证: 容器启动后日志中不再出现 'DB 加载策略失败(回退 YAML)'
【索引】models.py ScanTask 加复合索引
ix_scan_tasks_channel_created ON (channel, created_at DESC)
解决 dashboard/tasks_page 高频查询的全表扫描问题
(已在运行中 DB 用 CREATE INDEX CONCURRENTLY 补上)
【归档】scripts/archive_old_tasks.py
- scan_tasks 90天前 清 detail JSONB (省空间)
- scan_tasks 365天前 移到 scan_tasks_archive 归档表
- idempotency_records 7天 TTL 清过期幂等缓存
- policy_versions 只留最新 5 个
- 支持 --dry-run (默认) + --apply (真正执行)
- 分批 1000 条处理, 避免长事务锁表
- 归档表 scan_tasks_archive 已建 (含 4 个索引)
数据增长: 日均 523 条 → 年 ~19万条 ≈ 910 MB
当前 3660 条 ≈ 4.5 MB, 增长可控, 脚本可每周/每月 cron 跑一次
This commit is contained in:
@@ -300,15 +300,18 @@ class PolicyStore:
|
||||
def _load_db_or_yaml(self) -> Policy:
|
||||
"""优先 DB,回退 YAML。"""
|
||||
try:
|
||||
from sqlalchemy import select
|
||||
from app.db import SessionLocal
|
||||
from app.models import PolicyVersion
|
||||
|
||||
db = SessionLocal()
|
||||
try:
|
||||
pv = db.execute(
|
||||
select(PolicyVersion).order_by(PolicyVersion.created_at.desc())
|
||||
).scalar_one_or_none()
|
||||
# 用 ORM Query API — 直接返回 PolicyVersion 对象
|
||||
# 而不是 Row 对象(db.execute(select) 会返回 Row)
|
||||
pv = (
|
||||
db.query(PolicyVersion)
|
||||
.order_by(PolicyVersion.created_at.desc())
|
||||
.first() # 取最新一条,不管历史版本多少条
|
||||
)
|
||||
if pv:
|
||||
policy = Policy(
|
||||
version=pv.version,
|
||||
|
||||
Reference in New Issue
Block a user