Bouw een Python-interface rond de database · oefening
Lees resultaatkolommen op naam
De eerste beschikbare rij verschijnt momenteel als een tuple met waarden op vaste posities:
(1, 'IT-100', 'Cordless drill', 'tools', 7)
Je weet alleen dat index 1 de inventariscode bevat doordat je de SELECT-lijst kunt zien. Een aanroeper die row[1] schrijft, is ongemerkt afhankelijk van die volgorde. Deze versie maakt de bedoeling duidelijk:
row["asset_tag"]
row["name"]
SQLite kan die toegang op naam bieden met sqlite3.Row. De instelling hoort bij de verbinding en moet zijn ingesteld voordat de query wordt uitgevoerd:
connection.row_factory = sqlite3.Row
result = connection.execute("""complete query here""")
Open catalog_db.py. Laat de SQL voor beschikbare voorwerpen, result, fetchall() en de tijdelijke terugkeerwaarde (result, rows) precies zoals ze zijn. Voeg de toewijzing aan de row factory direct vóór result = connection.execute(...) toe.
De twee objecten blijven verschillend. result is nog steeds een Cursor. Elke waarde in rows is nu een Row. Een Row is geen dictionary, hoewel die zowel posities als geselecteerde kolomnamen ondersteunt. Met row = rows[0] verwijzen al deze uitdrukkingen naar waarden die de query heeft opgeleverd:
row["id"]
row["asset_tag"]
row["name"]
row["category"]
row["loan_days"]
Druk op Run. Het doet dezelfde aanroep als hiervoor: list_available_items(connection). De buitenste terugkeerwaarde blijft een tuple, het resultaattype blijft Cursor en het aantal rijen blijft vier. De veranderde regel laat het verschil zien:
First row type: Row
First row values: 1 | IT-100 | Cordless drill | tools | 7
De volgorde van die afgedrukte waarden komt nog steeds uit de precieze query, terwijl je Python-code nu hun namen kan gebruiken. Daardoor is de kans veel kleiner dat een latere wijziging in de volgorde van geselecteerde kolommen ongemerkt de verkeerde waarde aan een aanroeper geeft.
Submit geeft een standaardverbinding mee, dus de functie moet deze stap zelf configureren. Het probeert ook een leeg resultaat voor beschikbare voorwerpen en controleert dat je een lege rijlijst teruggeeft in plaats van vast te lopen op rows[0]. Houd de verbinding open. Hierna verplaats je deze instelling naar de ene plek waar verbindingen worden geopend.
Opdracht
Werk list_available_items(connection) bij zodat de functie connection.row_factory = sqlite3.Row instelt voordat ze execute() aanroept.
Laat de query en de tijdelijke terugkeerwaarde (result, rows) ongewijzigd. De teruggegeven lijst moet sqlite3.Row-waarden bevatten die alle vijf de geselecteerde kolomnamen ondersteunen, en de meegegeven verbinding moet open blijven.