0%

Mehrere Änderungen, ein Ergebnis · Übung

Eine zweite aktive Ausleihe ablehnen

Das Schema erlaubt mehrere Ausleihzeilen für einen Gegenstand, weil zurückgegebene Zeilen ein wertvoller Verlauf sind. Das bedeutet auch, dass das Schema allein zwei aktive Zeilen erlaubt. Die Ausleihoperation muss die zweite ablehnen.

Öffne transactions.py. Das neue checkout_loan(connection, loan) erhält ein Tupel mit vier Werten und hat bereits seine Transaktion und Einfügung. Führe vor der Einfügung die vorgegebene Abfrage nach einem aktiven Gegenstand mit (item_id,) aus und hole eine optionale Zeile ab.

Wenn eine Zeile vorhanden ist, löse genau diesen Fehler aus:

raise ValueError("That item is already checked out.")

Halte die Prüfung innerhalb von with connection: neben der Einfügung, sodass eine Ablehnung denselben Fehlerpfad durchläuft wie ein Einfügefehler. Zurückgegebener Verlauf passt nicht, weil sein Wert für returned_on vorhanden ist.

Dieses Programm bearbeitet jeweils eine Ausleihe. Mit den hier verwendeten Verbindungseinstellungen startet das Betreten von with connection: selbst keine Transaktion; die erste Einfügung startet sie. Der frühere Lesezugriff reserviert den Gegenstand nicht. Zwei gleichzeitig schreibende Programme bräuchten zusätzlichen Schutz dagegen, dass beide den Gegenstand als verfügbar sehen.

Die Funktion soll bei fehlenden übergeordneten IDs oder einer doppelten Ausleih-ID weiterhin die Datenbankregeln sprechen lassen. Fange diese Fehler nicht ab und ersetze sie nicht durch die Meldung zum aktiven Gegenstand. Wenn keine aktive Zeile passt, führe die statische gebundene Einfügung aus, lass den Kontext festschreiben und gib die ausdrücklich angegebene loan_id aus dem Tupel zurück.

Klicke auf Run. Der erste feste Aufruf verwendet Gegenstand 1, der bereits den aktiven Ausleihvorgang 501 hat, und sollte Folgendes zeigen:

ValueError: That item is already checked out.

In einer separaten Datenbank leiht Sam die verfügbaren Gegenstände 4 und 5 aus. Beide gelingen derzeit, weil die Funktion den Gegenstand schützt, nicht das Limit des Mitglieds. Beim erneuten Öffnen wird Sams aktive Anzahl zu 3. Dieses sichtbare Ergebnis über dem Limit zeigt die zweite Regel, die der Operation noch fehlt.

Submit prüft einen aktiven Gegenstand, einen mit ausschließlich zurückgegebenem Verlauf und einen noch nie ausgeliehenen. Es übergibt SQL-ähnlichen Datumstext als gewöhnliche Daten und verwendet IDs, die in der Aufgabenstellung nicht vorkommen. Außerdem prüft es, dass fehlende Gegenstände und Mitglieder weiterhin sqlite3.IntegrityError auslösen, erfolgreiche Arbeit nach erneutem Öffnen sichtbar ist und die übergebene Verbindung offen bleibt.

Aufgabe

Vervollständige die Prüfung auf einen aktiven Gegenstand in checkout_loan(connection, loan). Frage innerhalb desselben Verbindungskontexts nach der vorgeschlagenen item_id mit returned_on IS NULL.

Wenn eine Zeile existiert, löse ValueError("That item is already checked out.") aus. Füge andernfalls das gebundene Tupel ein, schreibe durch normales Verlassen des Kontexts fest, gib seine Ausleih-ID zurück und lass die Verbindung offen.