"""Резервная копия файла базы перед пакетом с записями в Jira: VACUUM INTO даёт согласованный снимок при WAL.""" from datetime import datetime from pathlib import Path from . import paths def make_backup(conn, backups_dir: Path, label: str, keep: int = 30) -> Path: backups_dir = Path(backups_dir) paths.secure_dir(backups_dir) target = backups_dir / f"{datetime.now():%Y%m%d-%H%M%S-%f}-{label}.sqlite" conn.execute("VACUUM INTO ?", (str(target),)) # копии перед миграцией схемы (db.migrate) — для отката, ротации не подлежат files = sorted(p for p in backups_dir.glob("*.sqlite") if "-schema-v" not in p.name) if keep > 0: for old in files[:-keep]: old.unlink() return target