feat: Skript zum Prüfen der Datenbank-Sicherungen
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>
This commit is contained in:
@@ -0,0 +1,22 @@
|
|||||||
|
#!/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}")
|
||||||
Reference in New Issue
Block a user