""" ADR-073 Phase 2-5: 回填 incidents.alertname 欄位 2026-04-12 ogt: 舊資料 signals JSONB 用 alert_name key (非 alertname alias) 新資料 (Phase 2-1 修復後) 已有 alertname alias 執行方式: kubectl exec -n awoooi-prod -- python3 scripts/backfill_alertname.py """ import asyncio import sys sys.path.insert(0, "/app") from sqlalchemy import text from src.db.base import get_db_context async def main() -> None: async with get_db_context() as db: # 先查有多少需要回填 count_r = await db.execute( text("SELECT COUNT(*) FROM incidents WHERE alertname IS NULL") ) total = count_r.scalar() print(f"待回填: {total} 筆") # 優先用 signals->0->>'alertname' (Phase 2-1 修復後的新寫法) # fallback: signals->0->>'alert_name' (舊寫法) result = await db.execute( text(""" UPDATE incidents SET alertname = COALESCE( signals->0->>'alertname', signals->0->>'alert_name' ) WHERE alertname IS NULL AND ( signals->0->>'alertname' IS NOT NULL OR signals->0->>'alert_name' IS NOT NULL ) """) ) await db.commit() print(f"已回填: {result.rowcount} 筆") # 剩餘無法回填的 remain_r = await db.execute( text("SELECT COUNT(*) FROM incidents WHERE alertname IS NULL") ) remain = remain_r.scalar() print(f"仍為 NULL: {remain} 筆 (signals 無 alert_name 欄位,無法回填)") if __name__ == "__main__": asyncio.run(main())