0%

Abschlussprojekt: Ein Verleihprogramm mit dauerhafter Speicherung · Übung

Die verfügbaren Gegenstände ausgeben

Ein Befehl für verfügbare Gegenstände soll das öffentliche Abfrageergebnis darstellen, keine zweite Variante der Abfrage erstellen. Die Datenbankschnittstelle entscheidet bereits, welche Gegenstände verfügbar sind, und gibt sie in Inventarkennzeichen-Reihenfolge zurück. available_command ist nur für Pfad, Verbindung und Texttabelle verantwortlich.

In der zusammenhängenden Demo ist Gegenstand 1 aktiv ausgeliehen, wenn dieser Aufruf läuft:

main(["available", str(database_path)])

Füge available_command(args) hinzu. Sein Namensraum hat neben dem Befehlsnamen nur args.database. Lehne einen fehlenden Pfad ab und rufe dann prepare_database auf, um die vorhandene Datei zu prüfen oder zu migrieren. Öffne die Anwendungsverbindung und rufe list_available_items(connection) genau einmal auf. Speichere die zurückgegebene Liste, bevor du die Verbindung in finally schließt.

Füge kein SQL, keine weitere Abfrage und keine Sortierung auf CLI-Seite hinzu. Jeder zurückgegebene Wert ist ein einfaches Dictionary mit genau diesen Schlüsseln: id, asset_tag, name, category und loan_days. Die Liste hat bereits die durch die Datenbankschnittstelle festgelegte öffentliche Reihenfolge.

Gib erst nach erfolgreicher Abfrage und geschlossener Verbindung diese feste Kopfzeile aus:

id | asset_tag | name | category | loan_days

Verwende dann eine for-Schleife, um pro Dictionary eine Zeile in derselben Feldreihenfolge auszugeben, mit | zwischen den Werten. Ein leeres Ergebnis gibt weiterhin die Kopfzeile aus und gibt 0 zurück. Es ist eine erfolgreiche Antwort auf die Frage, kein Anwendungsfehler.

Der Befehl fängt dokumentierte ValueError-Ergebnisse aus Prüfungen auf fehlende Pfade oder Schemas ab. Bei jedem erfolgreichen Lesezugriff lässt er stderr leer. Ein unerwarteter Abfrage- oder Verbindungsdefekt muss nach außen weiterlaufen, und ein Lesebefehl darf den dauerhaft gespeicherten Zustand nicht ändern.

Füge den exakten Zweig if args.command == "available": return available_command(args) zu main hinzu und klicke dann auf Run:

== available ==
Status: 0
id | asset_tag | name | category | loan_days
3 | EL-300 | Projector | electronics | 3
2 | EV-200 | Folding table | events | 14
stderr: <empty>

Beachte die Sortierung nach Inventarkennzeichen: EL-300 steht vor EV-200, obwohl Gegenstand 3 nach Gegenstand 2 eingefügt wurde. Diese Reihenfolge stammt direkt aus list_available_items. Eine gründliche Prüfung liefert unbekannte Unicode-Werte und Werte mit Leerzeichen, einen aktiven Gegenstand und eine absichtlich andere Einfügereihenfolge. Außerdem prüft sie einen leeren Katalog, das Schließen der Verbindung und das Ausbleiben von Schreibzugriffen.

Aufgabe

Ergänze oder vervollständige available_command(args) und füge diesen Zweig in main hinzu:

if args.command == "available":
    return available_command(args)

Lehne eine fehlende Datenbank ab, bereite sie vor und öffne sie, rufe list_available_items genau einmal auf und schließe die Anwendungsverbindung in finally. Gib die exakte Kopfzeile mit fünf Spalten und pro zurückgegebenem Dictionary eine durch senkrechte Striche getrennte Zeile aus, ohne erneut zu sortieren oder abzufragen. Gib sowohl bei leerem als auch bei nicht leerem Ergebnis 0 zurück.