ausgabe optimiert

This commit is contained in:
Czechman 2025-02-16 14:39:48 +01:00
parent 0dc125293d
commit be49c2a6e7
1 changed files with 68 additions and 85 deletions

View File

@ -1,94 +1,77 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import json import sqlite3
from datetime import datetime import sys
from sqlalchemy import create_engine, Column, Integer, String, Float, DateTime, ForeignKey, Text def list_tables(conn):
from sqlalchemy.orm import declarative_base, relationship, sessionmaker """Gibt eine Liste aller Tabellennamen in der Datenbank zurück."""
cursor = conn.cursor()
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
tables = [row[0] for row in cursor.fetchall()]
return tables
# Basis-Klasse (SQLAlchemy 2.0-konform) def count_entries(conn, table_name):
Base = declarative_base() """Gibt die Anzahl der Einträge in der angegebenen Tabelle zurück."""
cursor = conn.cursor()
try:
cursor.execute(f"SELECT COUNT(*) FROM {table_name}")
count = cursor.fetchone()[0]
except Exception as e:
count = None
print(f"Fehler beim Zählen der Einträge in {table_name}: {e}")
return count
class Bundle(Base): def print_table_contents(conn, table_name):
__tablename__ = 'bundles' """Gibt den kompletten Inhalt der angegebenen Tabelle aus."""
id = Column(Integer, primary_key=True) cursor = conn.cursor()
machine_name = Column(String, unique=True) try:
human_name = Column(String) cursor.execute(f"SELECT * FROM {table_name}")
current_version_id = Column(Integer, ForeignKey('bundle_versions.id')) except Exception as e:
print(f"Fehler beim Abrufen der Inhalte von {table_name}: {e}")
# Beziehung zur aktuellen Version (explizit mit foreign_keys für current_version_id)
current_version = relationship("BundleVersion", uselist=False, foreign_keys=[current_version_id])
# Alle Versionen hier verwenden wir einen lambda-Ausdruck, um die Spalte BundleVersion.bundle_id zu referenzieren
versions = relationship("BundleVersion", back_populates="bundle", foreign_keys=lambda: [BundleVersion.bundle_id])
# Verkaufshistorie
sales_history = relationship("BundleSalesHistory", back_populates="bundle")
class BundleVersion(Base):
__tablename__ = 'bundle_versions'
id = Column(Integer, primary_key=True)
bundle_id = Column(Integer, ForeignKey('bundles.id'))
version_hash = Column(String)
version_data = Column(Text) # Als JSON-String
timestamp = Column(DateTime, default=datetime.utcnow)
# Hier geben wir explizit an, dass für diese Beziehung die Spalte bundle_id verwendet wird
bundle = relationship("Bundle", back_populates="versions", foreign_keys=[bundle_id])
class BundleSalesHistory(Base):
__tablename__ = 'bundle_sales_history'
id = Column(Integer, primary_key=True)
bundle_id = Column(Integer, ForeignKey('bundles.id'))
bundles_sold = Column(Float)
timestamp = Column(DateTime, default=datetime.utcnow)
bundle = relationship("Bundle", back_populates="sales_history")
def main():
# Verbindung zur bereits vorhandenen SQLite-Datenbank
engine = create_engine('sqlite:///bundles.db')
Session = sessionmaker(bind=engine)
session = Session()
# Alle Bundles aus der Tabelle 'bundles' abfragen
bundles = session.query(Bundle).all()
if not bundles:
print("Die Datenbank enthält noch keine Bundles.")
return return
for bundle in bundles: # Spaltennamen abrufen
print("---------------------------------------------------") column_names = [desc[0] for desc in cursor.description]
print(f"Bundle-ID: {bundle.id}") print("Spalten:", column_names)
print(f"Machine Name: {bundle.machine_name}") rows = cursor.fetchall()
print(f"Human Name: {bundle.human_name}") for row in rows:
print(row)
if bundle.current_version:
print(f"Aktuelle Version (ID): {bundle.current_version.id}") def main():
print(f"Version Hash: {bundle.current_version.version_hash}") # Parameter auswerten:
try: # Standard: Nur Tabellenliste mit Eintragszahl
version_info = json.loads(bundle.current_version.version_data) # Wenn "detail" angegeben wurde, sollen auch die Inhalte ausgegeben werden.
# Hier geben wir nur einen gekürzten Ausschnitt der Version-Daten aus # Wird "detail <tablename>" angegeben, dann nur für die angegebene Tabelle.
version_str = json.dumps(version_info, indent=2)[:300] detail = False
print("Version-Daten (gekürzt):") specific_table = None
print(version_str + " ...")
except Exception: if len(sys.argv) > 1:
print("Version-Daten (roher Text):") if sys.argv[1].lower() == "detail":
print(bundle.current_version.version_data) detail = True
print(f"Letzte Aktualisierung: {bundle.current_version.timestamp}") if len(sys.argv) > 2:
else: specific_table = sys.argv[2]
print("Keine aktuelle Version hinterlegt.")
# Verbindung zur Datenbank herstellen
# Alle historischen Versionen ausgeben conn = sqlite3.connect("bundles.db")
print("\nHistorische Versionen:")
for version in bundle.versions: tables = list_tables(conn)
print(f" Version-ID: {version.id}, Timestamp: {version.timestamp}, Hash: {version.version_hash}") if not tables:
print("Die Datenbank enthält keine Tabellen.")
# Verkaufszahlen ausgeben return
print("\nVerkaufshistorie:")
if bundle.sales_history: print("Tabellen in der Datenbank:")
for sale in bundle.sales_history: for table in tables:
print(f" {sale.timestamp}: {sale.bundles_sold} verkauft") # Falls ein spezifischer Tabellename angegeben wurde, überspringe alle anderen
else: if specific_table and table.lower() != specific_table.lower():
print(" Keine Verkaufsdaten vorhanden.") continue
print("---------------------------------------------------") count = count_entries(conn, table)
count_str = f"{count} Einträge" if count is not None else "unbekannte Einträge"
print(f" - {table}: {count_str}")
if detail:
print(f" Inhalt der Tabelle {table}:")
print_table_contents(conn, table)
print("-" * 40)
conn.close()
if __name__ == "__main__": if __name__ == "__main__":
main() main()