0%

Stel precieze vragen · oefening

Wanneer een query geen rij vindt

Een zoekopdracht naar gereedschap kan twee heel gewone uitkomsten hebben: één passende rij of helemaal geen passende rij. Python heeft voor beide gevallen een resultaatvorm nodig, zodat het programma kan reageren zonder een lege zoekopdracht als een defecte database te behandelen.

Het project roept de functie in first_tool.py zo aan:

first_tool(connection)

connection bevat al een open verbinding met de catalogus. De functie stuurt deze volledige, vaste query via die verbinding:

cursor = connection.execute(
    """
    SELECT asset_tag, name
    FROM items
    WHERE category = 'tools'
    ORDER BY asset_tag ASC
    LIMIT 1
    """
)

De aanroep van connection.execute(...) geeft de SQL-instructie aan SQLite. De teruggegeven cursor vertegenwoordigt het resultaat van deze query. Dat betekent nog niet dat Python een rij uit dat resultaat heeft gehaald.

Open first_tool.py. Op de laatste regel staat nu return None. Verander alleen die regel:

return cursor.fetchone()

De aanroep .fetchone() vraagt om één rij. Wanneer de catalogus gereedschap bevat, komt die rij binnen als een tuple met de twee geselecteerde waarden. Wanneer geen enkele rij voldoet, geeft .fetchone() Python None terug.

Voor het zichtbare gereedschapsresultaat volgen de tupleposities de lijst na SELECT: eerst de inventariscode, dan de naam. De functie bouwt die tuple niet zelf. SQLite produceert de rij, de cursor bevat het resultaat en .fetchone() haalt één resultaatrij naar Python.

Druk op Run. Zoek na het bestaande onderdeel search.sql deze twee aanroepen:

== first_tool.py ==
first_tool(connection) with tools
('TL-100', 'Cordless drill')
first_tool(connection) without tools
None

Elke aanroep krijgt een aparte open verbinding. De eerste catalogus heeft rijen met gereedschap; de tweede heeft die bewust niet. De functie en de letterlijke SQL blijven precies hetzelfde.

Voorspel vóór het uitvoeren de tweede afgedrukte waarde. De query bevat nog steeds geldige SQL, de tabel bestaat nog steeds en geen enkele databasebewerking is mislukt. Het enige verschil is dat geen van de opgeslagen rijen category = 'tools' heeft. Als je None ziet, bevestigt dat dat je programma een leeg zoekresultaat als gegevens kan verwerken, niet als een exception die je moet verhelpen.

Python None betekent hier dat de query nul rijen heeft opgeleverd. Dat verschilt van SQL NULL, een waarde die binnen een rij kan voorkomen. Een rij zoals ('TL-100', NULL) zou nog steeds een rij zijn en in Python aankomen als een tuple die None bevat. Deze oefening geeft helemaal geen tuple terug wanneer er geen gereedschap is.

Houd bij dat onderscheid de aanroeper in gedachten. Code die first_tool(connection) gebruikt, kan eerst if result is None controleren voordat die tupleposities probeert te lezen. Voor elke mogelijke uitkomst krijgt die code één voorspelbare Python-vorm.

Submit probeert andere codes en invoegvolgordes. Behoud de opgegeven sortering en limiet zodat “eerste” voorspelbaar blijft, en geef de waarde van .fetchone() terug in plaats van de cursor of een lijst met rijen.

Een leeg antwoord is nog steeds een geldig antwoord. Je functie geeft de aanroeper nu één tuple als er gereedschap is en een duidelijke None als dat er niet is.

Opdracht

Verander in first_tool.py de laatste regel in return cursor.fetchone().

Voer het project uit en controleer beide afgedrukte aanroepen: de ene moet een tuple met twee waarden teruggeven en de catalogus zonder gereedschap moet None teruggeven.