Listet je Backup, wie viele Schlagwörter, Budget-Vorlagen und kategorisierte Buchungen darin stecken. Nach einem Datenverlust sieht man damit auf einen Blick, welche Sicherung noch vollständig ist – statt nach Zeitstempel zu raten. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
23 lines
996 B
Python
23 lines
996 B
Python
#!/usr/bin/env python3
|
|
"""Listet je Backup, wie viele Schlagwörter/Budget-Vorlagen/kategorisierte
|
|
Buchungen darin stecken. So sieht man, welches Backup noch heil ist."""
|
|
import glob, os, sqlite3, sys
|
|
|
|
muster = sys.argv[1] if len(sys.argv) > 1 else "/var/lib/certain-finance/backups/*.db"
|
|
print(f"{'Datei':<34}{'Schlagw.':>9}{'Budget':>8}{'Buch.m.Kat':>12}")
|
|
for f in sorted(glob.glob(muster)):
|
|
try:
|
|
con = sqlite3.connect(f"file:{f}?mode=ro", uri=True)
|
|
def z(sql):
|
|
try:
|
|
return con.execute(sql).fetchone()[0]
|
|
except sqlite3.Error:
|
|
return "-"
|
|
print(f"{os.path.basename(f):<34}"
|
|
f"{z('SELECT COUNT(*) FROM categorization_rules'):>9}"
|
|
f"{z('SELECT COUNT(*) FROM budget_template_lines'):>8}"
|
|
f"{z('SELECT COUNT(*) FROM transactions WHERE category_id IS NOT NULL'):>12}")
|
|
con.close()
|
|
except Exception as e:
|
|
print(f"{os.path.basename(f):<34} Fehler: {e}")
|