Wijzig gegevens veilig · oefening
Controleer hoeveel rijen zijn geraakt
De controles vóór en na de wijziging bewijzen dat je wijzigingsfuncties werken, maar hun aanroepers ontvangen nog steeds None. Een aanroeper heeft een klein stukje direct bewijs nodig: heeft deze instructie één rij geraakt, of kwam een unieke code nergens mee overeen?
connection.execute(...) geeft een cursor terug. Voor een INSERT, UPDATE of DELETE meldt de rowcount van die cursor hoeveel rijen die instructie heeft geraakt. Lees die waarde direct uit de cursor die de wijzigingsinstructie teruggeeft.
Open catalog_changes.py. Vervang in add_item de losse aanroep door deze twee regels:
cursor = connection.execute(statement, item)
return cursor.rowcount
Doe hetzelfde in change_loan_days en remove_item en laat de bestaande instructie en parametertuple van elke functie precies zoals ze zijn:
cursor = connection.execute(statement, (loan_days, asset_tag))
return cursor.rowcount
cursor = connection.execute(statement, (asset_tag,))
return cursor.rowcount
Verander find_item niet; die geeft nog steeds één tuple of None terug via .fetchone().
Dit bewijs hoort elke wijzigingsfunctie terug te geven:
| Bewerking | Wat overeenkwam | Verwachte rowcount |
|---|---|---|
| een nieuwe geldige rij invoegen | één nieuwe rij | 1 |
| een bekende unieke code wijzigen of verwijderen | één bestaande rij | 1 |
| een ontbrekende code wijzigen of verwijderen | geen rij | 0 |
Gebruik de cursor van precies die aanroep. Als je eerst een andere instructie uitvoert en een andere cursor bekijkt, beantwoordt het getal de vraag van de aanroeper niet meer. Door cursor = connection.execute(...) en return cursor.rowcount bij elkaar te houden, is het verband makkelijk te volgen.
Druk op Run. De aanroepen melden nu deze waarden naast dezelfde rijen van vóór en na de wijziging:
add_item(connection, (7, "KT-700", "Repair kit", "tools", 5))
1
change_loan_days(connection, "EL-300", 8)
1
change_loan_days(connection, "NO-404", 8)
0
remove_item(connection, "EL-400")
1
remove_item(connection, "NO-404")
0
De insert raakt één nieuwe rij. Bij een passende unieke code raakt een update of delete één rij; een ontbrekende code raakt er nul. Omdat asset_tag uniek is, horen deze begeleide functies nooit een getal boven één te melden wanneer hun WHERE-voorwaarde correct is.
Een update kan 1 melden, ook wanneer je de rij op de bestaande waarde instelt. Een voorwerp met acht dagen op 8 instellen komt bijvoorbeeld nog steeds met één rij overeen. Het aantal zegt dat de instructie die rij heeft geraakt, niet dat de oude en nieuwe waarden verschillen.
rowcount is bewijs over de instructie die zojuist is uitgevoerd. Het zegt niet dat de wijziging ook na deze open verbinding blijvend is opgeslagen, en het is geen totaal voor de hele catalogus. Behoud de cursor van de wijzigingsaanroep en geef de waarde terug voordat je een andere instructie via die cursor uitvoert.
Submit controleert de teruggegeven gehele getallen en de resulterende catalogus samen. Een vast in de code geschreven 1 kan een ontbrekende code niet verklaren, en een aantal dat correct lijkt kan het wijzigen van de verkeerde rijen niet goedmaken. Behoud de veilige SQL en voeg alleen de directe return toe.
Je functies vertellen hun aanroeper nu met één bruikbaar getal wat er is gebeurd, terwijl de bestaande rijcontroles nog steeds precies aantonen wat is veranderd.
Opdracht
Bewaar in add_item, change_loan_days en remove_item de cursor die de bestaande aanroep connection.execute(...) teruggeeft en geef direct cursor.rowcount terug.
Laat elke SQL-instructie en parametertuple ongewijzigd, voer alle onderdelen uit en stuur de module in.