0%

Abschlussprojekt: Ein Verleihprogramm mit dauerhafter Speicherung · Übung

Einen Gegenstand ausleihen

Eine Ausleihe kann aus drei bekannten Gründen scheitern, und diese Gründe sind für die Person nützlich, die das Programm ausführt. Der Gegenstand kann bereits aktiv ausgeliehen sein, das Mitglied kann sein Limit erreicht haben, oder die angeforderten IDs können mit einer Katalogregel in Konflikt stehen. checkout_command muss diese Bedeutungen erhalten, ohne einen anderen Defekt zu verbergen.

Die Demo ruft auf:

main([
    "checkout", str(database_path), "501", "1", "17", "2026-08-26"
])

Füge checkout_command(args) hinzu. Sein Namensraum enthält args.database, args.loan_id, args.item_id, args.member_id und args.checked_out_on. Argparse hat die drei IDs bereits in positive ganze Zahlen umgewandelt. Bereinige die Ausleihbeschriftung mit trimmed(args.checked_out_on, "CHECKED_OUT_ON"). Hier bleiben Datumswerte Text, statt geparst oder mit einem Kalender abgeglichen zu werden.

Verlange den Datenbankpfad, bevor die Validierung etwas öffnen kann. Rufe dann prepare_database auf, öffne die Anwendungsverbindung mit open_database und führe diesen einen Schnittstellenaufruf aus:

recorded_id = checkout_item(
    connection, args.loan_id, args.item_id, args.member_id, checked_out_on
)

Schließe die Verbindung in finally. checkout_item führt beide Anwendungsprüfungen aus, verwendet eine Transaktion für seinen Schreibzugriff, übersetzt den Integritätsfehler seiner Einfügung und lässt vom aufrufenden Code verwaltete Verbindungen offen. Behalte diese Logik in catalog_db.py.

Fange die dokumentierten ValueError-Meldungen an der CLI-Grenze ab. Sie müssen stderr unverändert nach dem Präfix Error: erreichen:

That item is already checked out.
That member has reached the loan limit.
The checkout conflicts with a catalog rule.

Jede Ablehnung gibt 1 zurück, schreibt nichts auf stdout und ändert keine Ausleihzeile. Fange weder OperationalError, ProgrammingError, TypeError noch jedes Exception ab. Eine fehlende Tabelle ist keine gewöhnliche Ausleihablehnung und soll als der Defekt sichtbar bleiben, der sie ist.

Gib nach erfolgreichem Commit und Schließen Loan recorded: ID mit der zurückgegebenen Ausleih-ID aus und gib dann 0 zurück. Füge den exakten Zweig if args.command == "checkout": return checkout_command(args) in main hinzu.

Klicke auf Run. Der temporäre Katalog hat bereits drei Gegenstände und Mitglied 17:

== checkout ==
Status: 0
stdout: Loan recorded: 501
stderr: <empty>
Active item IDs after reopening: [1]

Eine gründliche Prüfung probiert außerdem einen aktiven Gegenstand, ein Mitglied genau am Limit, unbekannte Fremdschlüssel, eine doppelte Ausleih-ID, eine leere Beschriftung und eine fehlende Datenbank aus. Sie öffnet nach jedem Fall erneut, sodass Ausgabe und dauerhafter Zustand übereinstimmen müssen.

Aufgabe

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

if args.command == "checkout":
    return checkout_command(args)

Lehne eine fehlende Datenbank ab, bereinige CHECKED_OUT_ON, bereite den vorhandenen Katalog vor und öffne ihn, und rufe checkout_item einmal mit den fünf geparsten Werten auf. Schließe die Anwendungsverbindung in finally. Gib bei Erfolg Loan recorded: ID aus und gib 0 zurück; leite nur dokumentierte ValueError-Ergebnisse durch report_error.