refactor: 管线写入依赖解耦——pipeline_write 直接 import
bzzoiro_events / bzzoiro_standings / bzzoiro_stats 直接 import src.data.pipeline_write(_write_raw_event/_write_lineage/_safe_write_ingest_failure), 删除 bzzoiro.py 门面中的 pipeline_write 转发胶水。 保留 fetch_*/_fetch_json_async/REQUEST_INTERVAL 经 bz. 门面调用(测试 monkeypatch 入口); 测试 best-effort 改为 patch 管线模块自身命名空间(from-import 绑定语义)。 函数语义与「失败不拖垮主流程」不变;source_record_id/transform_name 约定不变。 全量测试 270 通过。
This commit is contained in:
@@ -16,6 +16,7 @@ from datetime import datetime, timedelta, timezone
|
||||
from src.data.bzzoiro_common import _match_key, _to_date, _to_int_or_none
|
||||
from src.data.config import BZZOIRO_LEAGUE_IDS, LEAGUE_COUNTRIES, LEAGUE_NAMES
|
||||
from src.data.normalize import normalize_bzzoiro
|
||||
from src.data.pipeline_write import _safe_write_ingest_failure, _write_lineage, _write_raw_event
|
||||
from src.data.sources import register
|
||||
from src.data.team_names_zh import zh_name
|
||||
from src.db.models import Match
|
||||
@@ -98,7 +99,7 @@ class BzzoiroSource:
|
||||
# 单联赛抓取失败隔离:记录错误后继续其余联赛,不拖垮整批
|
||||
logger.exception("bzzoiro fetch failed for %s", code)
|
||||
league_r["errors"].append(f"fetch failed: {e}")
|
||||
await bz._safe_write_ingest_failure(
|
||||
await _safe_write_ingest_failure(
|
||||
db,
|
||||
entity_type="events",
|
||||
source_record_id=None,
|
||||
@@ -300,11 +301,9 @@ async def _write_events_bronze(
|
||||
source_record_id 查重保证;best-effort:基础设施写入失败只记 warning,
|
||||
绝不拖垮采集主流程(与 _safe_write_ingest_failure 同级约束)。
|
||||
"""
|
||||
from src.data import bzzoiro as bz
|
||||
|
||||
try:
|
||||
await bz._write_raw_event(db, "bzzoiro", source_record_id, raw_payload, batch_id)
|
||||
await bz._write_lineage(
|
||||
await _write_raw_event(db, "bzzoiro", source_record_id, raw_payload, batch_id)
|
||||
await _write_lineage(
|
||||
db, "bzzoiro", source_record_id,
|
||||
"matches", target_match_id, "events_ingest",
|
||||
{"league": league_code, "match_status": match_status},
|
||||
|
||||
Reference in New Issue
Block a user