#!/usr/bin/env python3 """Rauchtest fuer den Datenbankzugang. Meldet sich an, liest den Bestand und zeigt, worauf Phase 2 aufsetzt. Nur SELECT - dieses Skript schreibt nichts. python3 check_db.py """ import sys from db import verbindung def main(): with verbindung() as conn: nutzer, datenbank, version = conn.execute( "select current_user, current_database(), version()" ).fetchone() print(f"verbunden als {nutzer}@{datenbank}") print(f" {version.split(' on ')[0]}") erw = [r[0] for r in conn.execute("select extname from pg_extension order by 1")] print(f" Extensions: {', '.join(erw)}") # Zwischen "im Image nicht vorhanden" und "nur noch nicht angelegt" # unterscheiden - das erste ist ein Image-Tausch, das zweite eine # Migration. if "vector" not in erw: verfuegbar = conn.execute( "select default_version from pg_available_extensions where name = 'vector'" ).fetchone() if verfuegbar: print(f" vector {verfuegbar[0]} liegt bereit, ist aber nicht angelegt") else: print(" vector fehlt im Image - Phase 2 kann keine Embeddings ablegen") print("\nTabellen") for name, in conn.execute( """select relname from pg_class c join pg_namespace n on n.oid = c.relnamespace where c.relkind = 'r' and n.nspname = 'public' order by relname""" ): anzahl = conn.execute(f'select count(*) from "{name}"').fetchone()[0] print(f" {name:22} {anzahl:>8}") von, bis, slots, gesamt = conn.execute( "select min(slot), max(slot), count(distinct slot), count(*) from raw_items" ).fetchone() if not gesamt: print("\nraw_items ist leer - Phase 1 hat hier noch nichts abgelegt.") return 0 print(f"\nraw_items: {gesamt} Items in {slots} Slots, {von} bis {bis}") # Volltextabdeckung entscheidet, worauf Dubletten und Embeddings # ueberhaupt rechnen koennen - sie ist je Quelle sehr verschieden. print("\nje Quelle") print(f" {'quelle':<16}{'items':>7}{'volltext':>10}{'teaser':>8}{'revidiert':>11}") for quelle, n, volltext, teaser, revidiert in conn.execute( """select quelle, count(*), count(volltext), count(teaser), count(*) filter (where revisionen > 0) from raw_items group by 1 order by 2 desc""" ): print(f" {quelle:<16}{n:>7}{volltext:>10}{teaser:>8}{revidiert:>11}") print("\njuengste Items") for id_, quelle, titel in conn.execute( "select id, quelle, titel from raw_items order by id desc limit 5" ): print(f" {id_:>7} {quelle:<14}{titel[:60]}") return 0 if __name__ == "__main__": sys.exit(main())