0%

Abschlussprojekt: Ein Verleihprogramm mit dauerhafter Speicherung · Übung

Ein Mitglied registrieren

Eine Mitgliederzeile hat jetzt fünf Werte, die die Befehlsgrenze gemeinsam überstehen müssen. Die CLI ist für Textbereinigung verantwortlich, das Datenbankmodul für die parametrisierte Einfügung. Keines soll die Aufgabe des anderen übernehmen.

Die Demo führt nach dem Initialisieren der Datenbank und dem Import der drei Gegenstände diesen exakten Aufruf aus:

main([
    "register-member", str(database_path), "17", "MB-017",
    "Riley", "riley@example.test", "--loan-limit", "2.5",
])

Argparse übergibt sechs Namensraumfelder an register_member_command: args.database, args.member_id, args.member_code, args.name, args.email und args.loan_limit. Die ID ist bereits ein positiver int. Das ausdrückliche Limit ist bereits ein positiver endlicher float; ohne die Option ist sein Wert die ganze Zahl 3.

Füge diese kleine Textfunktion hinzu, danach register_member_command(args):

def trimmed(value, label):
    text = value.strip()
    if not text:
        raise ValueError(f"{label} must not be blank.")
    return text

Verlange zuerst, dass der Datenbankpfad existiert. Bereinige dann Mitgliedscode, Name und E-Mail-Adresse mit trimmed(value, label). Verwende die Beschriftungen MEMBER_CODE, NAME und EMAIL, sodass eine Eingabe nur aus Leerraum zu einer exakten Meldung wie Error: EMAIL must not be blank. wird. Tue das vor der Schemavorbereitung oder dem Öffnen einer Verbindung, weil ungültige Eingabe den Datenbankzustand nicht ändern soll.

Rufe prepare_database(args.database) auf, um die vorhandene Datei zu validieren oder zu migrieren. Öffne die Anwendungsverbindung mit open_database und schließe sie in finally, unabhängig davon, ob die Registrierung gelingt oder einen dokumentierten Konflikt auslöst. Rufe die Funktion zum Einfügen eines Mitglieds einmal auf:

register_member(
    connection, args.member_id, member_code, name, email, args.loan_limit
)

Diese Funktion verwendet Platzhalter, schreibt die fünf ausdrücklich angegebenen Werte fest, lässt die Verbindung des aufrufenden Codes offen und übersetzt nur den Integritätskonflikt ihrer Einfügung zu ValueError("The member ID or code is already in use."). Fange dokumentierte ValueError-Ergebnisse an der CLI-Grenze ab. Kopiere ihr SQL nicht in lending.py und fange keine unabhängigen Datenbankfehler ab.

Gib erst nach erfolgreich geschlossener Verbindung den bereinigten Code aus und gib 0 zurück. Füge den exakten Zweig if args.command == "register-member": return register_member_command(args) in main hinzu.

Klicke auf Run, um den dauerhaften Zustand nach erneutem Öffnen zu sehen:

== register-member ==
Status: 0
stdout: Member registered: MB-017
stderr: <empty>
Stored member after reopening: 17 | MB-017 | Riley | 2.5 | riley@example.test

Eine gründliche Prüfung verwendet Standardlimits und Limits mit Nachkommastellen, Unicode und SQL-ähnlichen Text, doppelte IDs und Codes, leere Felder und einen fehlenden Pfad. Wörtlicher Text muss durchgehend Daten bleiben.

Aufgabe

Füge die exakte Funktion trimmed(value, label) aus der Anleitung hinzu, ergänze oder vervollständige register_member_command(args) und füge diesen Zweig in main hinzu:

if args.command == "register-member":
    return register_member_command(args)

Lehne eine fehlende Datenbank ab, bereinige und validiere MEMBER_CODE, NAME und EMAIL, bereite die Datenbank vor und rufe die vorgegebene Schnittstelle register_member mit allen fünf Mitgliederwerten auf. Schließe die Anwendungsverbindung in finally. Gib bei Erfolg Member registered: CODE aus und gib 0 zurück; leite nur dokumentierte ValueError-Ergebnisse durch report_error.