0%

Mehrere Änderungen, ein Ergebnis · Übung

Eine Ausleihe durch Rückgabe abschließen

Die Rückgabe eines Gegenstands soll eine Ausleihzeile abschließen, nicht ihren Verlauf löschen. Der aufrufende Code kennt die Ausleih-ID und die Textbeschriftung, die in returned_on gespeichert werden soll.

Öffne transactions.py. Ein neuer Funktionsrumpf return_loan(connection, loan_id, returned_on) und diese statische Anweisung sind vorhanden:

UPDATE loans
SET returned_on = ?
WHERE id = ? AND returned_on IS NULL;

Der erste Platzhalter erhält returned_on, der zweite loan_id. Die letzte Bedingung schützt einen abgeschlossenen Ausleihvorgang davor, erneut zurückgegeben zu werden. Identifiziere die Zeile anhand ihrer Ausleih-ID, nicht ihrer Gegenstands-ID. Ein Gegenstand kann mehrere historische Ausleihvorgänge haben.

Verwende innerhalb von return_loan einen Verbindungskontext und übergib die Werte separat:

with connection:
    result = connection.execute(RETURN_LOAN, (returned_on, loan_id))
    changed = result.rowcount == 1
return changed

Lies rowcount unmittelbar aus diesem Aktualisierungsergebnis. Der Wert 1 bedeutet, dass dieser Aufruf den einen aktiven Ausleihvorgang geändert hat. Der Wert 0 bedeutet, dass die ID fehlte oder ihre Rückgabeangabe bereits vorhanden war. Wandle diesen Nachweis in den zugesagten booleschen Wert um.

Klicke auf Run. Die festen Aufrufe schließen Ausleihvorgang 501 ab, versuchen ihn erneut und probieren die fehlende ID 9999:

return_loan(connection, 501, '2026-08-26') -> True
return_loan(connection, 501, '2026-08-27') -> False
return_loan(connection, 9999, '2026-08-27') -> False
Fresh connection loan 501 returned_on: 2026-08-26
Connection still open: yes

Der zweite Aufruf darf das erste Datum nicht überschreiben. Ein normales Verlassen des Kontexts schreibt sowohl die erfolgreiche Aktualisierung als auch harmlose Aktualisierungen ohne betroffene Zeilen fest. Die Funktion überlässt das Schließen weiterhin dem aufrufenden Code.

Submit verwendet unbekannte Ausleih-IDs und andere Rückgabebeschriftungen. Es prüft, dass ein anderer aktiver Ausleihvorgang unverändert bleibt, öffnet die Datenbank erneut, um die dauerhafte Speicherung zu belegen, wiederholt die Operation und führt danach über die ursprüngliche Verbindung eine Abfrage aus.

Aufgabe

Implementiere return_loan(connection, loan_id, returned_on) in transactions.py.

Führe die vorgegebene parametrisierte Aktualisierung innerhalb eines Verbindungskontexts aus. Gib nur dann True zurück, wenn ihr unmittelbarer rowcount gleich 1 ist. Gib bei einem fehlenden oder bereits zurückgegebenen Ausleihvorgang False zurück. Schließe die Verbindung nicht.