Daten sicher ändern · Übung
Prüfen, wie viele Zeilen geändert wurden
Die Prüfungen vor und nach der Änderung belegen, dass deine Änderungsfunktionen funktionieren. Ihr aufrufender Code erhält aber weiterhin None. Er braucht einen kleinen unmittelbaren Nachweis: Hat diese Anweisung eine Zeile betroffen, oder hat ein eindeutiges Kennzeichen nichts gefunden?
connection.execute(...) gibt einen Cursor zurück. Bei einem INSERT, UPDATE oder DELETE meldet dessen rowcount, wie viele Zeilen die Anweisung betroffen hat. Lies den Wert sofort vom Cursor ab, den die ändernde Anweisung zurückgegeben hat.
Öffne catalog_changes.py. Ersetze in add_item den bloßen Aufruf durch diese beiden Zeilen:
cursor = connection.execute(statement, item)
return cursor.rowcount
Nimm dieselbe Änderung in change_loan_days und remove_item vor. Behalte dabei die bestehende Anweisung und das Parametertupel jeder Funktion genau bei:
cursor = connection.execute(statement, (loan_days, asset_tag))
return cursor.rowcount
cursor = connection.execute(statement, (asset_tag,))
return cursor.rowcount
Ändere find_item nicht. Es gibt weiterhin über .fetchone() ein Tupel oder None zurück.
Diesen Nachweis sollte jede ändernde Funktion zurückgeben:
| Operation | Was passte | Erwarteter rowcount |
|---|---|---|
| eine neue gültige Zeile einfügen | eine neue Zeile | 1 |
| ein bekanntes eindeutiges Kennzeichen aktualisieren oder entfernen | eine bestehende Zeile | 1 |
| ein fehlendes Kennzeichen aktualisieren oder entfernen | keine Zeile | 0 |
Verwende den Cursor genau dieses Aufrufs. Wenn du zuerst eine andere Anweisung ausführst und einen anderen Cursor untersuchst, beantwortet die Zahl nicht mehr die Frage des aufrufenden Codes. cursor = connection.execute(...) und return cursor.rowcount zusammenzuhalten macht den Zusammenhang leicht nachvollziehbar.
Klicke auf Run. Die Aufrufe melden jetzt diese Werte neben denselben Zeilen vor und nach der Änderung:
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
Das Einfügen betrifft eine neue Zeile. Ein gefundenes eindeutiges Kennzeichen lässt eine Aktualisierung oder Löschung eine Zeile betreffen; ein fehlendes Kennzeichen betrifft null. Weil asset_tag eindeutig ist, sollten diese angeleiteten Funktionen nie eine Zahl über eins melden, wenn ihre WHERE-Bedingung korrekt ist.
Eine Aktualisierung kann 1 melden, auch wenn du die Zeile auf ihren bestehenden Wert setzt. Einen Gegenstand mit acht Tagen auf 8 zu setzen trifft zum Beispiel weiterhin eine Zeile. Die Anzahl sagt, dass die Anweisung diese Zeile betroffen hat, nicht, dass der alte und neue Wert sich unterscheiden.
rowcount liefert Informationen über die gerade ausgeführte Anweisung. Es sagt nicht, dass die Änderung über diese offene Verbindung hinaus dauerhaft gespeichert wurde, und ist keine Gesamtanzahl für den Katalog. Behalte den Cursor des ändernden Aufrufs und gib seinen Wert zurück, bevor du über diesen Cursor eine weitere Anweisung ausführst.
Submit prüft die zurückgegebenen ganzen Zahlen und den resultierenden Katalog zusammen. Eine fest eingetragene 1 kann ein fehlendes Kennzeichen nicht erklären, und eine korrekt aussehende Anzahl kann die Änderung falscher Zeilen nicht ausgleichen. Behalte das sichere SQL bei und ergänze nur die unmittelbare Rückgabe.
Deine Funktionen sagen dem aufrufenden Code jetzt mit einer nützlichen Zahl, was passiert ist, während die bestehenden Zeilenprüfungen weiterhin genau belegen, was sich geändert hat.
Aufgabe
Speichere in add_item, change_loan_days und remove_item den Cursor, den der bestehende Aufruf connection.execute(...) zurückgibt, und gib sofort cursor.rowcount zurück.
Behalte jede SQL-Anweisung und jedes Parametertupel unverändert bei, führe alle Abschnitte aus und reiche das Modul ein.