0%

Meerdere wijzigingen, één uitkomst · eindproject

Eindproject: Project: leen een hele set uit of niets

Een uitleenset is alleen bruikbaar wanneer elk gevraagd voorwerp samen kan worden uitgeleend. Bouw checkout_kit(connection, loan_rows) in het nieuwe bestand kit_checkout.py, zodat de volledige lijst één uitkomst bereikt.

Elk element van loan_rows is de bekende tuple:

(id, item_id, member_id, checked_out_on)

De vaste insert en drie controlequery’s zijn meegeleverd. Zet één with connection: om de volledige lus, niet erin. Doe voor elke tuple het volgende:

  1. Weiger een actief voorwerp met ValueError("That item is already checked out.").

  2. Als het lid bestaat, vergelijk dan het volgende actieve aantal met de opgeslagen limiet en werp ValueError("That member has reached the loan limit.") op wanneer het te hoog zou worden.

  3. Voer de gebonden insert uit en verhoog het aantal geslaagde inserts.

Eerdere inserts in de lus wachten op dezelfde verbinding op afronding. Je volgende query voor een actief voorwerp en je ledentelling kunnen ze zien. Dat is van belang wanneer een set een voorwerp herhaalt of meerdere rijen samen de limiet van een lid bereiken.

Vang in deze functie geen fouten op. Als een latere rij een van de beschreven ValueError-fouten of een databasefout veroorzaakt, moet die de verbindingscontext verlaten. De context draait dan elke rij terug die door deze aanroep is voorgesteld en de fout gaat door naar de aanroeper. Oude gecommitte uitleningen blijven ongewijzigd.

Geef het aantal gecommitte rijen terug nadat de context normaal is verlaten. Een lege lijst geeft 0 terug.

Druk op Run. De geslaagde set slaat ID’s 9001 en 9002 op en geeft 2 terug. De mislukte set voegt voorwerp 4 eerst in en komt daarna voorwerp 1 tegen, dat al actief is uitgeleend. De functie hoort de exacte voorwerpmelding op te werpen en na heropenen geen van beide voorgestelde ID’s te tonen.

Submit varieert de foutpositie, dubbele voorwerpen binnen één lijst, ledenlimieten waaronder 2.5, ontbrekende bovenliggende records en dubbele uitleen-ID’s. Het bekijkt zowel de handelende als nieuwe verbindingen en controleert of andere oude rijen blijven staan. De regels zijn nu bekend; de uitdaging is ze allemaal binnen één volledige transactie te houden.

Opdracht

Implementeer checkout_kit(connection, loan_rows) in kit_checkout.py.

Gebruik één verbindingscontext rond de volledige lus. Pas vóór elke gebonden insert de bestaande controles op actieve voorwerpen en ledenlimieten toe. Geef het gecommitte aantal terug. Vang niets op: elke beschreven weigering of databasefout moet alle rijen van die aanroep terugdraaien en doorgaan naar de aanroeper, terwijl oude rijen en de open verbinding bruikbaar blijven.