0%

Abschlussprojekt: Ein Verleihprogramm mit dauerhafter Speicherung · Übung

Einen aktiven Ausleihvorgang durch Rückgabe abschließen

Eine Rückgabe muss einen aktiven Ausleihvorgang genau einmal ändern. Wenn die ID fehlt oder bereits zurückgegeben wurde, meldet die Datenbankschnittstelle False. Die CLI muss dieses Ergebnis in einen präzisen Fehler umwandeln, ohne den früheren Verlauf zu überschreiben.

Nach ihrer erfolgreichen Ausleihe ruft die Demo auf:

main(["return", str(database_path), "501", "2026-08-27"])

Füge return_command(args) hinzu. Argparse übergibt args.database, die ganze Zahl args.loan_id und den String args.returned_on. Verlange zuerst den Datenbankpfad. Bereinige die Beschriftung mit trimmed(args.returned_on, "RETURNED_ON"), behalte sie aber als Text. Ein Wert, der wie SQL, ein Datum oder eine gewöhnliche Notiz aussieht, muss über dieselbe parametrisierte Schnittstelle gespeichert werden.

Bereite die vorhandene Datenbank vor, öffne sie mit open_database und rufe auf:

changed = return_loan(connection, args.loan_id, returned_on)

Schließe die Anwendungsverbindung in finally. return_loan aktualisiert nur eine Zeile, deren Ausleih-ID passt und deren returned_on weiterhin SQL NULL ist. Es schreibt die neue Beschriftung fest und gibt für diese eine Änderung True zurück. Eine fehlende oder bereits zurückgegebene ID erzeugt False und verändert keine andere Zeile.

Prüfe changed erst, nachdem finally die Verbindung geschlossen hat. Wenn es falsch ist, übergib ValueError("No active loan has that ID.") an report_error. Das schreibt Error: No active loan has that ID. auf stderr und gibt 1 zurück, ohne etwas auf stdout zu schreiben. Eine unabhängige Ausnahme aus return_loan muss nach dem Schließen der Verbindung weiterhin nach außen laufen.

Wenn changed wahr ist, gib Loan returned: ID erst nach dem Schließen aus und gib 0 zurück. Füge den exakten Zweig if args.command == "return": return return_command(args) in main hinzu. Führe in lending.py kein UPDATE aus, suche nicht nach Gegenstands-ID und fange keinen unabhängigen Programmier- oder Datenbankfehler ab.

Klicke auf Run, um das Ergebnis zu sehen, nachdem eine neue Verbindung die Datei erneut geöffnet hat:

== return ==
Status: 0
stdout: Loan returned: 501
stderr: <empty>
Returned label after reopening: 2026-08-27

Eine gründliche Prüfung schließt einen aktiven Ausleihvorgang durch Rückgabe ab, wiederholt den Befehl mit einer anderen Beschriftung und probiert eine fehlende ID aus. Der zweite Aufruf muss die erste Beschriftung unberührt lassen. Sie verwendet außerdem Leerraum und SQL-ähnlichen Text, prüft das Verhalten bei fehlendem Pfad und bestätigt, dass die Anwendungsverbindung sowohl bei Erfolg als auch bei Ablehnung schließt.

Aufgabe

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

if args.command == "return":
    return return_command(args)

Lehne eine fehlende Datenbank ab, bereinige RETURNED_ON, bereite den Katalog vor und öffne ihn, und rufe return_loan einmal auf. Schließe die Anwendungsverbindung in finally. Melde bei falschem Ergebnis No active loan has that ID. mit Status 1; gib andernfalls Loan returned: ID aus und gib 0 zurück.