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 sqlalchemy import select
|
||||
|
||||
from src.data.bzzoiro_common import _to_float_or_none, _to_int_or_none
|
||||
from src.data.config import BZZOIRO_LEAGUE_IDS, LEAGUE_COUNTRIES, LEAGUE_NAMES
|
||||
from src.data.pipeline_write import _safe_write_ingest_failure, _write_lineage, _write_raw_event
|
||||
from src.data.team_names_zh import zh_name
|
||||
from src.db.models import Standing, Team
|
||||
from src.db.repositories import LeagueRepository, TeamRepository
|
||||
@@ -33,6 +34,7 @@ async def fetch_bzzoiro_standings(league_code: str, season: str | None = None) -
|
||||
params: dict = {}
|
||||
if season:
|
||||
params["season"] = season
|
||||
|
||||
return await bz._fetch_json_async(f"/leagues/{league_id}/standings/", params)
|
||||
|
||||
|
||||
@@ -57,9 +59,10 @@ async def ingest_bzzoiro_standings(db, *, leagues: Iterable[str], season: str |
|
||||
season 为 None 时采集当前赛季(bzzoiro 默认返回 is_current 赛季)。
|
||||
球队名与 events 管线使用同一 normalize 规则,保证 Team 匹配。
|
||||
"""
|
||||
from src.data import bzzoiro as bz
|
||||
from src.data.team_names import normalize as normalize_name
|
||||
|
||||
from src.data import bzzoiro as bz
|
||||
|
||||
result: dict = {"leagues": {}, "total_upserted": 0, "errors": []}
|
||||
for code in leagues:
|
||||
league_r: dict = {"upserted": 0, "teams_created": 0, "rows": 0, "errors": []}
|
||||
@@ -68,7 +71,7 @@ async def ingest_bzzoiro_standings(db, *, leagues: Iterable[str], season: str |
|
||||
except Exception as e:
|
||||
logger.exception("bzzoiro standings fetch failed for %s", code)
|
||||
league_r["errors"].append(str(e))
|
||||
await bz._safe_write_ingest_failure(
|
||||
await _safe_write_ingest_failure(
|
||||
db,
|
||||
entity_type="standings",
|
||||
source_record_id=None,
|
||||
@@ -198,11 +201,9 @@ async def _write_standings_bronze(
|
||||
命中同一条 RawEvent);best-effort:基础设施写入失败只记 warning,
|
||||
绝不拖垮采集主流程。
|
||||
"""
|
||||
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,
|
||||
"standings", league_id, "standings_ingest",
|
||||
{"league": league_code, "season": season_label, "rows_upserted": rows_upserted},
|
||||
|
||||
Reference in New Issue
Block a user