0%

Meerdere wijzigingen, één uitkomst · oefening

Respecteer de uitleenlimiet van een lid

Sam begint met één actieve uitlening en een opgeslagen limiet van 2.5. De huidige functie beschermt elk voorwerp, maar laat Sam zowel voorwerp 4 als voorwerp 5 toevoegen, wat drie actieve uitleningen oplevert.

De beslissing gaat over de volgende hele uitlening:

Nu actiefOpgeslagen limietVolgend aantalToestaan?
12.52Ja
22.53Nee

Open transactions.py. De query’s om het lid op te zoeken en actieve uitleningen te tellen zijn meegeleverd. Haal binnen dezelfde verbindingscontext, na de voorwerpcontrole en vóór de insert, de ledenrij op met (member_id,).

Als het lid bestaat, tel dan alleen de uitleningen van dat lid waarvan de waarde van returned_on ontbreekt. Weiger de insert wanneer:

active_count + 1 > loan_limit

Werp de fout met precies deze melding op:

raise ValueError("That member has reached the loan limit.")

Rond loan_limit niet af. Elke uitleen voegt één hele uitlening toe en de directe vergelijking geeft de beschreven grens: 2 <= 2.5 is waar, terwijl 3 <= 2.5 onwaar is. Afgeronde uitleningen tellen niet mee.

Als het opzoeken van het lid None teruggeeft, sla je deze applicatiecontrole over. De latere insert bereikt de regel voor de verwijzende sleutel en veroorzaakt sqlite3.IntegrityError. Zo blijft het gedrag behouden dat aanroepers al kennen voor een ontbrekend bovenliggend record.

Druk op Run. De aanroep met het actieve voorwerp blijft ongewijzigd. Sams eerste aanroep met een beschikbaar voorwerp geeft 8101 terug. De tweede hoort nu dit te tonen:

ValueError: That member has reached the loan limit.
Reopened active loans for MB-028: 2

Submit behandelt een leeg aantal, één resterende plek, een lid dat precies aan de limiet zit, afgeronde geschiedenis en de grens van 2.5. Het controleert ook of aantallen alleen bij het voorgestelde lid horen, geslaagd werk blijvend is opgeslagen, ontbrekende bovenliggende records integriteitsfouten blijven en de oorspronkelijke verbinding bruikbaar blijft.

Eén uitleen bevat nu beide applicatieregels in één transactie. Je bent klaar om dezelfde controles toe te passen op elke rij in een voorgestelde set.

Opdracht

Breid checkout_loan uit met de controle op de ledenlimiet binnen de bestaande verbindingscontext.

Haal de loan_limit van het lid op, tel alleen de actieve uitleningen van dat lid en sta de insert precies dan toe wanneer active_count + 1 <= loan_limit. Werp bij een bereikt maximum ValueError("That member has reached the loan limit.") op. Een ontbrekend lid moet nog steeds de IntegrityError van de verwijzende sleutel bereiken.