Mehrere Änderungen, ein Ergebnis · Abschlussprojekt
Abschlussprojekt: Projekt: Ein ganzes Set ausleihen oder nichts
Ein Ausleihset ist nur nützlich, wenn alle angeforderten Gegenstände zusammen ausgeliehen werden können. Baue checkout_kit(connection, loan_rows) in der neuen Datei kit_checkout.py, sodass die vollständige Liste ein gemeinsames Ergebnis erreicht.
Jedes Element von loan_rows ist das bekannte Tupel:
(id, item_id, member_id, checked_out_on)
Die statische Einfügung und drei Prüfungsabfragen sind vorgegeben. Setze ein einzelnes with connection: um die vollständige Schleife, nicht hinein. Für jedes Tupel:
Lehne einen aktiven Gegenstand mit
ValueError("That item is already checked out.")ab.Wenn das Mitglied existiert, vergleiche die nächste aktive Anzahl mit dem gespeicherten Limit und löse
ValueError("That member has reached the loan limit.")aus, wenn sie zu hoch wäre.Führe die gebundene Einfügung aus und erhöhe die Erfolgsanzahl.
Frühere Einfügungen in der Schleife sind auf derselben Verbindung noch offen. Deine nächste Abfrage nach einem aktiven Gegenstand und die Anzahl der aktiven Ausleihvorgänge des Mitglieds können sie sehen. Das ist wichtig, wenn ein Set einen Gegenstand wiederholt oder mehrere Zeilen zusammen das Limit eines Mitglieds erreichen.
Fange in dieser Funktion keine Fehler ab. Wenn eine spätere Zeile einen der dokumentierten ValueError-Fehler oder einen Datenbankfehler auslöst, muss dieser den Verbindungskontext verlassen. Der Kontext rollt dann jede von diesem Aufruf vorgeschlagene Zeile zurück, und der Fehler läuft zum aufrufenden Code weiter. Alte festgeschriebene Ausleihvorgänge bleiben unverändert.
Gib nach normalem Verlassen des Kontexts die festgeschriebene Anzahl zurück. Eine leere Liste gibt 0 zurück.
Klicke auf Run. Das erfolgreiche Set speichert die IDs 9001 und 9002 und gibt 2 zurück. Das fehlschlagende Set fügt zuerst Gegenstand 4 ein und trifft dann auf Gegenstand 1, der bereits aktiv ist. Es sollte die exakte Gegenstandsmeldung auslösen und beim erneuten Öffnen keine der vorgeschlagenen IDs zeigen.
Submit variiert die Fehlerposition, doppelte Gegenstände innerhalb einer Liste, Mitgliedslimits einschließlich 2.5, fehlende übergeordnete Datensätze und doppelte Ausleih-IDs. Es untersucht sowohl die ausführende als auch eine neue Verbindung und prüft, dass unabhängige alte Zeilen bleiben. Die Regeln sind inzwischen bekannt. Die Herausforderung besteht darin, sie alle innerhalb einer vollständigen Transaktion zu halten.
Aufgabe
Implementiere checkout_kit(connection, loan_rows) in kit_checkout.py.
Verwende einen Verbindungskontext um die vollständige Schleife. Wende vor jeder gebundenen Einfügung die bekannten Prüfungen für aktive Gegenstände und Mitgliedslimits an. Gib die festgeschriebene Anzahl zurück. Fange nichts ab: Jede dokumentierte Ablehnung oder jeder Datenbankfehler muss jede Zeile dieses Aufrufs zurückrollen und weitergegeben werden, während alte Zeilen und die offene Verbindung verwendbar bleiben.