0%

Daten sicher ändern · Übung

Einen neuen Gegenstand einfügen

Der Verleihkatalog braucht ein neues Reparaturset. Python hat den vollständigen Gegenstand bereits als Tupel, und die Datenbank soll diese fünf Werte speichern, ohne Text darin in SQL zu verwandeln.

Run führt diesen exakten Aufruf über eine offene Katalogverbindung aus:

add_item(connection, (7, "KT-700", "Repair kit", "tools", 5))

Die Tupelpositionen sind id, asset_tag, name, category und loan_days. Öffne catalog_changes.py und finde die neue Funktion unterhalb von find_item:

def add_item(connection, item):
    statement = """
        INSERT INTO items (id, asset_tag, name, category, loan_days)
        VALUES (?, ?, ?, ?, ?)
    """
    connection.execute(statement)

INSERT INTO items benennt die Tabelle, die eine Zeile erhalten soll. Die ausdrückliche Spaltenliste legt Bedeutung und Reihenfolge aller fünf Werte fest. VALUES liefert fünf Platzhalterpositionen, eine für jede benannte Spalte.

Es lohnt sich, die Zuordnung vor dem Bearbeiten zu prüfen:

Spalte und PlatzhalterpositionWert in item
id, erstes ?erster Tupelwert
asset_tag, zweites ?zweiter Tupelwert
name, drittes ?dritter Tupelwert
category, viertes ?vierter Tupelwert
loan_days, fünftes ?fünfter Tupelwert

Für den sichtbaren Aufruf bedeutet das: Die Datenbank erhält 7 für id, "KT-700" für asset_tag, "Repair kit" für name, "tools" für category und 5 für loan_days. Vorher muss nichts zusammengefügt, in Anführungszeichen gesetzt oder umgewandelt werden. Die Anweisung beschreibt die Operation; das Tupel enthält bereits die Zeile. Diese eindeutige Zuordnung sichtbar zu halten macht auch Fehler leichter erkennbar: fünf benannte Spalten, fünf Platzhalter und fünf Werte in derselben Reihenfolge.

Ändere die letzte Zeile so, dass das vollständige Tupel als separates Werteargument übergeben wird:

connection.execute(statement, item)

Klicke auf Run. Die Funktion gibt derzeit None zurück, was für diese Übung in Ordnung ist. Der wichtige Nachweis erscheint darunter:

item with tag KT-700
(7, 'KT-700', 'Repair kit', 'tools', 5)
unchanged neighbor EL-300
(5, 'EL-300', 'Projector', 'electronics', 2.5)

Die eingefügte Zeile kommt über dieselbe offene Verbindung unverändert zurück, und eine bestehende Nachbarzeile ist weiterhin intakt. Vorerst prüfst du nur, was diese offene Verbindung sehen kann. Später sorgst du dafür, dass Änderungen das Schließen und erneute Öffnen einer Verbindung überstehen.

Submit probiert unbekannte IDs, Apostrophe, SQL-ähnlichen Text und positive Leihdauern mit Nachkommastellen aus. Halte jeden Wert im separaten Tupel. Lass die ausdrückliche ID nicht weg, vertausche keine Tupelpositionen und öffne innerhalb der Funktion keine andere Verbindung.

Du hast die sichere Grenze zwischen Anweisung und Werten von einem Suchwert auf eine vollständige neue Katalogzeile übertragen: festes SQL auf der einen Seite, fünf unveränderte Python-Werte auf der anderen.

Aufgabe

Übergib in add_item das Tupel item als zweites Argument an connection.execute(statement, item). Behalte das ausdrückliche INSERT mit fünf Spalten und die fünf Platzhalter unverändert bei.

Führe das Projekt aus, bestätige die neue Zeile und die Nachbarzeile und reiche dann die Funktion ein.