Eindproject: een uitleenprogramma dat gegevens bewaart · oefening
Registreer een lid
Een ledenrij heeft nu vijf waarden die samen de opdrachtinterface moeten passeren. De CLI verwijdert omringende witruimte, de databasemodule beheert de geparametriseerde insert en geen van beide hoort de taak van de ander over te nemen.
De demo doet precies deze aanroep na het initialiseren van de database en het importeren van de drie voorwerpen:
main([
"register-member", str(database_path), "17", "MB-017",
"Riley", "riley@example.test", "--loan-limit", "2.5",
])
Argparse geeft zes namespacevelden door aan register_member_command: args.database, args.member_id, args.member_code, args.name, args.email en args.loan_limit. Het ID is al een positieve int. De expliciete limiet is al een positieve eindige float; zonder de optie is de waarde het gehele getal 3.
Voeg deze kleine tekstfunctie toe en daarna register_member_command(args):
def trimmed(value, label):
text = value.strip()
if not text:
raise ValueError(f"{label} must not be blank.")
return text
Vereis eerst dat het databasepad bestaat. Verwijder daarna de omringende witruimte uit de lidcode, naam en het e-mailadres met trimmed(value, label). Gebruik de labels MEMBER_CODE, NAME en EMAIL, zodat invoer met alleen witruimte één exacte melding oplevert, zoals Error: EMAIL must not be blank.. Doe dit vóór het voorbereiden van het schema of het openen van een verbinding, omdat ongeldige invoer de databasetoestand niet mag veranderen.
Roep prepare_database(args.database) aan om het bestaande bestand te valideren of te migreren. Open de applicatieverbinding met open_database en sluit die verbinding in finally, ongeacht of registratie slaagt of een gedocumenteerd conflict opwerpt. Roep de functie die een lid invoegt één keer aan:
register_member(
connection, args.member_id, member_code, name, email, args.loan_limit
)
Die functie gebruikt placeholders, commit de vijf expliciete waarden, laat de verbinding van de aanroeper open en zet alleen het integriteitsconflict van de insert om in ValueError("The member ID or code is already in use."). Vang gedocumenteerde ValueError-resultaten op bij de CLI-interface. Kopieer de SQL niet naar lending.py en vang geen losstaande databasefouten op.
Druk pas nadat de verbinding met succes is gesloten de code zonder omringende witruimte af en geef 0 terug. Voeg de exacte tak if args.command == "register-member": return register_member_command(args) toe aan main.
Druk op Run om de blijvend opgeslagen toestand na heropenen te zien:
== register-member ==
Status: 0
stdout: Member registered: MB-017
stderr: <empty>
Stored member after reopening: 17 | MB-017 | Riley | 2.5 | riley@example.test
Een grondige controle gebruikt standaardlimieten en limieten met een fractie, Unicode en tekst die op SQL lijkt, dubbele ID’s en codes, lege velden en een ontbrekend pad. Letterlijke tekst moet gedurende het hele traject gegevens blijven.
Opdracht
Voeg de exacte functie trimmed(value, label) uit de instructies toe, voeg register_member_command(args) toe of maak die af en zet deze tak in main:
if args.command == "register-member":
return register_member_command(args)
Weiger een ontbrekende database, verwijder omringende witruimte uit MEMBER_CODE, NAME en EMAIL en valideer ze. Bereid de database voor en roep de meegeleverde functie register_member aan met alle vijf de ledenwaarden. Sluit de applicatieverbinding in finally. Druk bij succes Member registered: CODE af en geef 0 terug; verwerk alleen gedocumenteerde ValueError-resultaten via report_error.