72 lines
2.2 KiB
Python
72 lines
2.2 KiB
Python
import argparse
|
|
import json
|
|
import traceback
|
|
|
|
from .config import Config
|
|
|
|
|
|
def parse_args():
|
|
parser = argparse.ArgumentParser(
|
|
description="Backfill migration_state watermark-ами из MSSQL Life_ таблиц."
|
|
)
|
|
parser.add_argument(
|
|
"--tables",
|
|
nargs="+",
|
|
help="Список source_table/target_table для обработки. По умолчанию берутся все incremental-таблицы.",
|
|
)
|
|
parser.add_argument(
|
|
"--overwrite",
|
|
action="store_true",
|
|
help="Перезаписать уже существующие watermark в replicator.migration_state.",
|
|
)
|
|
parser.add_argument(
|
|
"--dry-run",
|
|
action="store_true",
|
|
help="Только показать, какие watermark будут записаны, без сохранения в PostgreSQL.",
|
|
)
|
|
parser.add_argument(
|
|
"--json",
|
|
action="store_true",
|
|
help="Вывести итог в JSON.",
|
|
)
|
|
return parser.parse_args()
|
|
|
|
|
|
def main():
|
|
try:
|
|
from .migrator import DatabaseMigrator
|
|
|
|
args = parse_args()
|
|
config = Config()
|
|
migrator = DatabaseMigrator(config)
|
|
summary = migrator.backfill_watermarks(
|
|
table_names=args.tables,
|
|
overwrite=args.overwrite,
|
|
dry_run=args.dry_run,
|
|
)
|
|
|
|
if args.json:
|
|
print(json.dumps(summary, ensure_ascii=False, indent=2, default=str))
|
|
else:
|
|
print("\n" + "=" * 60)
|
|
print("BACKFILL WATERMARKS ЗАВЕРШЕН")
|
|
print("=" * 60)
|
|
print(f"Обработано: {summary['processed']}")
|
|
print(f"Обновлено: {summary['updated']}")
|
|
print(f"Пропущено: {summary['skipped']}")
|
|
print(f"Ошибок: {summary['failed']}")
|
|
print("=" * 60)
|
|
|
|
return 1 if summary['failed'] > 0 else 0
|
|
except KeyboardInterrupt:
|
|
print("\nBackfill прерван пользователем")
|
|
return 130
|
|
except Exception as e:
|
|
print(f"Критическая ошибка: {e}")
|
|
print(traceback.format_exc())
|
|
return 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|