first commit

This commit is contained in:
brusnitsyn
2026-04-16 17:57:58 +09:00
commit 7a13ff3b74
22 changed files with 3319 additions and 0 deletions

View File

@@ -0,0 +1,71 @@
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())