0%

Meerdere wijzigingen, één uitkomst · oefening

Verwerk één teruggave

Een voorwerp terugbrengen moet één uitleenrij afronden, niet de geschiedenis verwijderen. De aanroeper kent het uitleen-ID en het tekstlabel dat in returned_on moet worden opgeslagen.

Open transactions.py. Er is een nieuwe functieopzet return_loan(connection, loan_id, returned_on) en deze vaste instructie staat er al:

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

De eerste placeholder ontvangt returned_on; de tweede ontvangt loan_id. De laatste voorwaarde beschermt een afgeronde uitlening tegen opnieuw terugbrengen. Identificeer de rij met haar uitleen-ID, niet met het voorwerp-ID. Eén voorwerp kan meerdere historische uitleningen hebben.

Gebruik binnen return_loan één verbindingscontext en geef de waarden afzonderlijk door:

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

Lees rowcount direct uit dit updateresultaat. De waarde 1 betekent dat deze aanroep de ene actieve uitlening heeft gewijzigd. De waarde 0 betekent dat het ID ontbrak of dat de retourwaarde al aanwezig was. Zet dat bewijs om naar de beloofde Boolean.

Druk op Run. De vaste aanroepen verwerken de teruggave van uitlening 501, proberen het opnieuw en proberen het ontbrekende 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

De tweede aanroep mag de eerste datum niet overschrijven. Normaal verlaten van de context commit zowel de geslaagde update als de onschuldige updates die nul rijen raken. De functie laat het sluiten nog steeds aan de aanroeper over.

Submit gebruikt onbekende uitleen-ID’s en andere retourlabels. Het controleert of een andere actieve uitlening ongewijzigd blijft, heropent de database om blijvende opslag te bewijzen, herhaalt de bewerking en voert daarna een query via de oorspronkelijke verbinding uit.

Opdracht

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

Voer de meegeleverde geparametriseerde update binnen één verbindingscontext uit. Geef alleen True terug wanneer de direct gelezen rowcount gelijk is aan 1; geef False terug voor een ontbrekende of al afgeronde uitlening. Sluit de verbinding niet.