0%

Eine Python-Schnittstelle um die Datenbank legen · Übung

Die Ausleihe hinter einem Befehl bündeln

Der Beispielkatalog beginnt mit dem verfügbaren Gegenstand 1 und Riley unter einem Limit von drei. Ein vollständiger Befehl soll diese dauerhaft gespeicherte Zeile erzeugen:

checkout_item(connection, 9001, 1, 17, '2026-08-26') -> 9001
Fresh connection loan 9001: (9001, 1, 17, '2026-08-26', NULL)

Öffne catalog_db.py. Das neue checkout_item(connection, loan_id, item_id, member_id, checked_out_on) hat bereits die exakte Einfügung mit vier Platzhaltern und den Rückgabewert. Übertrage die beiden Ausleihentscheidungen, die du bereits gebaut hast, in diese Funktion.

Frage innerhalb eines Blocks with connection: zuerst nach einem aktiven Ausleihvorgang mit passender item_id und returned_on gleich NULL. Wenn fetchone() eine Zeile findet, löse den bekannten Fehler aus:

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

Wähle als Nächstes loan_limit aus members für member_id aus. Wenn das Mitglied existiert, zähle nur dessen aktive Ausleihvorgänge. Lehne ab, wenn das Hinzufügen eines weiteren das gespeicherte Limit überschreiten würde:

if active_count + 1 > member["loan_limit"]:
    raise ValueError("That member has reached the loan limit.")

Dieser Vergleich lässt bei einem Limit von 2.5 weiterhin Platz für zwei ganze aktive Ausleihvorgänge, aber keinen dritten. Wenn das Mitglied fehlt, erfinde keinen Limitfehler. Lass die gebundene Einfügung die Fremdschlüsselregel erreichen.

Führe die vorgegebene Einfügung innerhalb desselben Verbindungskontexts aus. Ihre vier Werte müssen ein separates Tupel bleiben, einschließlich SQL-ähnlichen Datumstextes. Lass das normale Verlassen des Kontexts festschreiben und gib dann die ausdrücklich angegebene loan_id zurück. Schließe die Verbindung nicht.

Die Funktion ist damit für ein Ausleihergebnis verantwortlich, während der aufrufende Code weiterhin die offene Verbindung verwaltet und einen weiteren Befehl ausführen kann.

Klicke auf Run. Neben dem erfolgreichen Aufruf oben versucht eine separate Datenbank immer checkout_item(connection, 501, 4, 17, "2026-08-26"). Ausleih-ID 501 existiert bereits, also sollte der Aufruf einen unveränderten IntegrityError zeigen. Eine neue Verbindung sollte keinen Ausleihvorgang für Gegenstand 4 finden und damit belegen, dass das Rollback stattfand, bevor die Kontrolle zurückkehrte.

Submit prüft auch beide exakten Ablehnungsmeldungen, zurückgegebenen Verlauf, ein Limit von 2.5, fehlende übergeordnete Datensätze, eine doppelte Ausleih-ID, Sichtbarkeit über eine neue Verbindung und die weitere Nutzung der übergebenen Verbindung.

Aufgabe

Vervollständige checkout_item(connection, loan_id, item_id, member_id, checked_out_on) in catalog_db.py.

Lehne innerhalb eines Verbindungskontexts einen bereits aktiven Gegenstand mit ValueError("That item is already checked out.") ab und eine Ausleihe, die das aktive Ausleihlimit des Mitglieds überschreiten würde, mit ValueError("That member has reached the loan limit."). Führe dann die vorgegebene gebundene Einfügung aus. Gib nach dem Commit loan_id zurück, lass andere sqlite3.IntegrityError-Werte unverändert und schließe die Verbindung nicht.