From ecbdcf35fbfff65dac295e63db482c5d79601076 Mon Sep 17 00:00:00 2001 From: lekss361 Date: Sun, 17 May 2026 22:07:40 +0300 Subject: [PATCH] fix(objective parser): use_float=True in ijson + default=str in json.dumps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ijson по умолчанию (use_float=False) возвращает все numeric values как Decimal. _row_to_lot строит raw_props через json.dumps(row, ...) — stdlib json не сериализует Decimal → TypeError → inner try/except swallows exception → run завершается status=done, lots=0. Двойной fix: 1. ijson.items(stream, "result.item", use_float=True) в обоих parse_lots_pf_stream — все numerics приходят как float (укладывается в float64 precision для финансовых сумм / площадей). 2. json.dumps(..., default=str) в обоих _row_to_lot и _row_to_corp_room_month — defense in depth для любых exotic типов. Glitchtip BACKEND-1L (release d1b721a, firstSeen 18:58:48Z) — silent fail после успешного streaming в PR #318 fixup. --- data/sql/70_parse_objective_raw.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/sql/70_parse_objective_raw.py b/data/sql/70_parse_objective_raw.py index 93798332..d3452c47 100644 --- a/data/sql/70_parse_objective_raw.py +++ b/data/sql/70_parse_objective_raw.py @@ -206,7 +206,7 @@ def _row_to_corp_room_month(row: dict, group_name: str, raw_id: int | None) -> d ), # Audit "raw_id": raw_id, - "raw_props": json.dumps(row, ensure_ascii=False), + "raw_props": json.dumps(row, ensure_ascii=False, default=str), } @@ -342,7 +342,7 @@ def _row_to_lot(row: dict, raw_id: int | None, snapshot_date: date) -> dict: "encumbrance_start_date": _parse_iso_date(row.get("Дата начала обременения")), "egrn_actual_date": _parse_iso_date(row.get("Дата актуальности данных из ЕГРН")), "raw_id": raw_id, - "raw_props": json.dumps(row, ensure_ascii=False), + "raw_props": json.dumps(row, ensure_ascii=False, default=str), "snapshot_date": snapshot_date, } @@ -543,7 +543,7 @@ def parse_lots_pf_stream( history_batch: list[dict] = [] batches_since_commit = 0 - for row in ijson.items(stream, "result.item"): + for row in ijson.items(stream, "result.item", use_float=True): if not isinstance(row, dict): continue params = _row_to_lot(row, raw_id, snapshot_date) @@ -712,7 +712,7 @@ def parse_lots_pf_stream( db.execute(_LOTS_HISTORY_INSERT, history_batch) batch = [] - for row in ijson.items(stream, "result.item"): + for row in ijson.items(stream, "result.item", use_float=True): if not isinstance(row, dict): continue params = _row_to_lot(row, raw_id, snapshot_date) -- 2.45.3