0%

Bouw een Python-interface rond de database · oefening

Geef beschikbare voorwerpen terug als gewone records

De aanroeper wil catalogusrecords ontvangen, zonder de interne objecten van SQLite. Een bruikbare terugkeerwaarde ziet er zo uit:

{'id': 1, 'asset_tag': 'IT-100', 'name': 'Cordless drill',
 'category': 'tools', 'loan_days': 7}

Het huidige paar (result, rows) heeft zijn doel bereikt: je zag dat uitvoering een cursor teruggeeft en fetchall() een afzonderlijke lijst met sqlite3.Row-waarden. Als je dat paar aan de aanroeper blijft teruggeven, moet elke aanroeper die details begrijpen.

Open catalog_db.py. Verander alleen het laatste stuk dat het resultaat teruggeeft in list_available_items(connection):

available_items = []
for row in rows:
    available_items.append(dict(row))
return available_items

Elke geconfigureerde Row kent de vijf namen uit de SELECT-lijst, dus maakt dict(row) een ingebouwde dictionary met precies deze sleutels:

id, asset_tag, name, category, loan_days

De lus zet elke opgehaalde Row om en verzamelt de dictionaries in een gewone lijst. Het resultaatobject blijft een nuttig lokaal implementatiedetail, maar komt niet meer buiten de functie. Aanroepers kunnen gewone dictionaries vergelijken, serialiseren of weergeven zonder sqlite3 te importeren of kolomposities te onthouden.

Laat de SQL ongewijzigd. De left join koppelt alleen actieve uitleningen en WHERE loans.id IS NULL behoudt voorwerpen zonder zo’n match. Dat betekent dat een voorwerp met afgeronde uitleengeschiedenis beschikbaar is, net als een voorwerp dat nooit is uitgeleend. ORDER BY items.asset_tag geeft de aanroeper rechtstreeks vanuit de database een vaste volgorde.

Druk op Run. De aanroep is nog steeds list_available_items(connection), met een verbinding uit open_database(database_path). De vorm van het resultaat dat de aanroeper ziet, verandert nu:

Returned container type: list
First row type: dict
First row values: 1 | IT-100 | Cordless drill | tools | 7

De uitvoer drukt ook alle vier de dictionaries af op volgorde van inventariscode. Het instellingenblok blijft ongewijzigd, omdat het aanpassen van de functie-interface de verbindingsinstellingen niet verandert.

Submit gebruikt nieuwe waarden, een naam met een apostrof, een door elkaar gehusselde invoegvolgorde, actieve uitleningen, afgeronde uitleengeschiedenis en voorwerpen die nooit zijn uitgeleend. Het roept de functie twee keer aan en controleert de exacte sleutels en waarden van ingebouwde dictionaries. Verander de catalogus niet en sluit de meegegeven verbinding niet.

Opdracht

Verander list_available_items(connection) zodat de functie met een lus een lijst met dict(row)-waarden opbouwt en die lijst teruggeeft.

Behoud de query, fetchall() en de verantwoordelijkheid voor de verbinding. Geef een lijst met ingebouwde dictionaries terug met precies id, asset_tag, name, category en loan_days, op volgorde van inventariscode. Geef de cursor of sqlite3.Row-waarden niet terug.