Wijzig gegevens veilig · oefening
Voeg één nieuw voorwerp in
De uitleencatalogus heeft een nieuwe reparatieset nodig. Python heeft het volledige voorwerp al als één tuple en de database moet die vijf waarden opslaan zonder tekst erin in SQL te veranderen.
Run voert deze exacte aanroep uit via een open verbinding met de catalogus:
add_item(connection, (7, "KT-700", "Repair kit", "tools", 5))
De tupleposities zijn id, asset_tag, name, category en loan_days. Open catalog_changes.py en zoek de nieuwe functie onder 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 noemt de tabel die een rij krijgt. De expliciete kolomlijst legt de betekenis en volgorde van alle vijf de waarden vast. VALUES geeft vijf placeholderposities, één voor elke genoemde kolom.
Het is zinvol om de koppeling te controleren voordat je iets wijzigt:
| Kolom en placeholderpositie | Waarde in item |
|---|---|
id, eerste ? | eerste tuplewaarde |
asset_tag, tweede ? | tweede tuplewaarde |
name, derde ? | derde tuplewaarde |
category, vierde ? | vierde tuplewaarde |
loan_days, vijfde ? | vijfde tuplewaarde |
Voor de zichtbare aanroep betekent dat dat de database 7 ontvangt voor id, "KT-700" voor asset_tag, "Repair kit" voor name, "tools" voor category en 5 voor loan_days. Je hoeft vooraf niets samen te voegen, tussen aanhalingstekens te zetten of om te zetten. De instructie beschrijft de bewerking; de tuple bevat de rij al. Door die één-op-éénkoppeling zichtbaar te houden, zijn fouten ook makkelijker te herkennen: vijf genoemde kolommen, vijf placeholders en vijf waarden in dezelfde volgorde.
Verander de laatste regel zodat de volledige tuple als afzonderlijk waardenargument wordt doorgegeven:
connection.execute(statement, item)
Druk op Run. De functie geeft momenteel None terug, wat voor deze oefening prima is. Het belangrijke bewijs verschijnt eronder:
item with tag KT-700
(7, 'KT-700', 'Repair kit', 'tools', 5)
unchanged neighbor EL-300
(5, 'EL-300', 'Projector', 'electronics', 2.5)
De ingevoegde rij komt ongewijzigd terug via dezelfde open verbinding en een bestaand ander voorwerp is nog intact. Voorlopig controleer je alleen wat die open verbinding kan zien. Later zorg je dat wijzigingen ook na het sluiten en heropenen van een verbinding blijven bestaan.
Submit probeert onbekende ID’s, apostrofs, tekst die op SQL lijkt en positieve termijnen met een gebroken deel. Houd elke waarde in de afzonderlijke tuple. Laat het expliciete ID niet weg, verwissel de tupleposities niet en open geen andere verbinding binnen de functie.
Je hebt de veilige scheiding voor waarden uitgebreid van één zoekwaarde naar een volledige nieuwe catalogusrij: vaste SQL aan de ene kant, vijf ongewijzigde Python-waarden aan de andere.
Opdracht
Geef in add_item de tuple item door als tweede argument aan connection.execute(statement, item). Laat de expliciete INSERT met vijf kolommen en de vijf placeholders ongewijzigd.
Voer het project uit, controleer de nieuwe rij en het andere voorwerp en stuur daarna de functie in.