diff --git a/tradein-mvp/backend/scripts/backfill_external_valuations_house_id.py b/tradein-mvp/backend/scripts/backfill_external_valuations_house_id.py index f5009937..e4983c10 100644 --- a/tradein-mvp/backend/scripts/backfill_external_valuations_house_id.py +++ b/tradein-mvp/backend/scripts/backfill_external_valuations_house_id.py @@ -165,21 +165,21 @@ def _process_row( stats.bump(row.source, "processed") try: - if dry_run: + # SAVEPOINT в обеих ветках: даже в dry-run matcher бьёт по БД (SELECT'ы), + # и его exception на реальной сессии перевёл бы транзакцию в aborted → + # каскад «current transaction is aborted» на всех последующих строках. + with db.begin_nested(): house_id = matcher(db, row.address) - else: - with db.begin_nested(): - house_id = matcher(db, row.address) - if house_id is not None: - db.execute( - text( - "UPDATE external_valuations " - " SET house_id = CAST(:hid AS bigint) " - " WHERE id = CAST(:eid AS bigint) " - " AND house_id IS NULL" - ), - {"hid": house_id, "eid": row.id}, - ) + if house_id is not None and not dry_run: + db.execute( + text( + "UPDATE external_valuations " + " SET house_id = CAST(:hid AS bigint) " + " WHERE id = CAST(:eid AS bigint) " + " AND house_id IS NULL" + ), + {"hid": house_id, "eid": row.id}, + ) if house_id is not None: stats.resolved += 1