d217553d79
新增 23 张表 sync_history:append-only,每次 task.run() 完成追加一行。 字段: dataset_id / run_date / status / trigger_source / started_at / finished_at / elapsed_sec / rows_written / message / error / stats (JSONB) / triggered_by 索引: (dataset_id, started_at) / (started_at) / (status) vs dataset_registry 的区别: - dataset_registry 只保留「最后一次状态」便于快查 - sync_history 保留完整历史,支持看板按天/按 task 维度聚合 + 失败回溯 自动落库: - SyncTask.run() 成功后调 _record_history() - 异常路径也写(避免排查时漏掉崩溃的 run) - 落库失败仅 warning 不阻塞主流程 新增 db_ops helpers: - insert_sync_history() - list_sync_history(dataset_id?, days, limit) 看板/API 用 - daily_sync_summary(days) 按日期聚合 ok/warning/error/blocked _ensure_schema 改造: 从 no-op 改为用 superuser 连接跑 create_all(),SA 2.x IF NOT EXISTS 幂等。 这样新增 model 不用手动跑 pg_bootstrap。生产首次部署仍建议跑 pg_bootstrap (它还要建 role / schema)。 测试: tests/test_schema_models.py 22 → 23 张表