gendesign/tradein-mvp/backend/app/tasks/gar_flats_load.py
bot-backend 55819aa821
All checks were successful
CI / changes (pull_request) Successful in 9s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
feat(tradein): ГАР-loader знаменателя — apartments-per-house → gar_house_flats + match к houses
2026-06-28 17:40:22 +03:00

74 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""CLI: загрузка ГАР-знаменателя «квартир на дом» + матч к houses (мигр. 143).
Запуск (каталог — УЖЕ распакованный ГАР региона, напр. папка `66/` из gar_xml.zip):
python -m app.tasks.gar_flats_load --dir /data/gar/66 --region 66 --version 2026-06-01
Делает два шага в одной транзакционной сессии:
1. load_gar_region — стриминговый парс XML → UPSERT gar_house_flats (коммит).
2. match_houses_to_gar — UPDATE houses.gar_flat_count по нормализованному адресу (коммит).
Многогигабайтный ДАМП качается/распаковывается отдельно (ops-шаг, см.
docs/gar-flats-runbook.md) — этот лоадер потребляет уже распакованные XML локально.
"""
from __future__ import annotations
import argparse
import logging
from datetime import date
from app.core.db import SessionLocal
from app.services.gar_flats_loader import load_gar_region, match_houses_to_gar
logger = logging.getLogger(__name__)
def run_gar_flats_load(dir_path: str, region_code: str, gar_version: str) -> dict[str, int]:
"""Парс+UPSERT (load_gar_region) затем матч (match_houses_to_gar). Возвращает счётчики."""
db = SessionLocal()
try:
load = load_gar_region(dir_path, region_code, gar_version, db=db)
matched = match_houses_to_gar(db, region_code=region_code)
db.commit()
finally:
db.close()
counts = load.to_counts()
counts["houses_matched"] = matched
logger.info(
"gar_flats_load DONE: region=%s version=%s houses=%d apartments=%d upserted=%d "
"houses_matched=%d duration=%ds",
region_code,
gar_version,
counts["houses"],
counts["apartments"],
counts["upserted"],
matched,
counts["duration_sec"],
)
return counts
def main() -> None:
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s %(levelname)s %(name)s: %(message)s",
)
parser = argparse.ArgumentParser(
description="ГАР loader: квартир на дом → gar_house_flats + match к houses"
)
parser.add_argument("--dir", required=True, help="каталог с распакованными ГАР XML региона")
parser.add_argument("--region", default="66", help="код региона (по умолчанию 66)")
parser.add_argument(
"--version",
default=date.today().isoformat(),
help="версия ГАР-дампа YYYY-MM-DD (по умолчанию сегодня)",
)
args = parser.parse_args()
run_gar_flats_load(args.dir, args.region, args.version)
if __name__ == "__main__":
main()