Bouw een Python-interface rond de database · oefening
Bundel een uitleen in één opdracht
De voorbeeldcatalogus begint met voorwerp 1 beschikbaar en Riley onder een limiet van drie. Eén volledige opdracht moet deze blijvend opgeslagen rij opleveren:
checkout_item(connection, 9001, 1, 17, '2026-08-26') -> 9001
Fresh connection loan 9001: (9001, 1, 17, '2026-08-26', NULL)
Open catalog_db.py. De nieuwe functie checkout_item(connection, loan_id, item_id, member_id, checked_out_on) bevat al de exacte insert met vier placeholders en de terugkeerwaarde. Breng de twee uitleencontroles die je eerder bouwde samen in deze functie.
Zoek binnen één blok with connection: eerst naar een actieve uitlening waarvan item_id overeenkomt en returned_on gelijk is aan NULL. Als fetchone() een rij vindt, werp je de eerder vastgelegde fout op:
raise ValueError("That item is already checked out.")
Selecteer daarna loan_limit uit members voor member_id. Als het lid bestaat, tel je alleen de actieve uitleningen van dat lid. Weiger de uitleen wanneer het toevoegen van één uitlening de opgeslagen limiet zou overschrijden:
if active_count + 1 > member["loan_limit"]:
raise ValueError("That member has reached the loan limit.")
Deze vergelijking geeft bij een limiet van 2.5 nog steeds ruimte voor twee hele actieve uitleningen, maar niet voor een derde. Als het lid ontbreekt, verzin dan geen limietfout. Laat de gebonden insert bij de constraint voor de verwijzende sleutel uitkomen.
Voer de meegeleverde insert uit binnen dezelfde verbindingscontext. De vier waarden moeten een afzonderlijke tuple blijven, ook als de datumtekst op SQL lijkt. Laat het normaal verlaten van de context committen en geef daarna het expliciete loan_id terug. Sluit de verbinding niet.
De functie is dus verantwoordelijk voor één uitleenuitkomst, terwijl de aanroeper de open verbinding blijft beheren en nog een opdracht kan uitvoeren.
Druk op Run. Naast de geslaagde aanroep hierboven probeert een afzonderlijke database altijd checkout_item(connection, 501, 4, 17, "2026-08-26"). Uitleen-ID 501 bestaat al, dus de aanroep moet een ongewijzigde IntegrityError tonen. Een nieuwe verbinding moet geen uitlening voor voorwerp 4 vinden. Dat bewijst dat de rollback is uitgevoerd voordat de besturing terugkeerde.
Submit controleert ook beide exacte weigeringsmeldingen, afgeronde uitleengeschiedenis, een limiet van 2.5, ontbrekende bovenliggende records, een dubbel uitleen-ID, zichtbaarheid via een nieuwe verbinding en verder gebruik van de meegegeven verbinding.
Opdracht
Maak checkout_item(connection, loan_id, item_id, member_id, checked_out_on) in catalog_db.py af.
Weiger binnen één verbindingscontext een al actief voorwerp met ValueError("That item is already checked out."), weiger een uitleen die de limiet voor actieve uitleningen van het lid zou overschrijden met ValueError("That member has reached the loan limit.") en voer daarna de meegeleverde gebonden insert uit. Geef loan_id terug na de commit, laat andere sqlite3.IntegrityError-waarden ongewijzigd en sluit de verbinding niet.