75 lines
2.8 KiB
Python
Executable File
75 lines
2.8 KiB
Python
Executable File
#!/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())
|