Hoofdstuk 8 · oefening
Bouw een Python-interface rond de database
Haal alle rijen uit één resultaat op
Run begint met vier beschikbare catalogusrijen:
1 | IT-100 | Cordless drill | tools | 7
2 | IT-200 | Folding table | events | 3
4 | IT-400 | Projector screen | electronics | 2
5 | IT-500 | Repair kit | tools | 5
De query vindt ze al. Bekijk nu de twee Python-objecten die betrokken zijn bij het ophalen ervan.
Je werkruimte bevat drie zichtbare bestanden. schema.sql maakt de tabellen items, members en loans opnieuw aan die je al kent; laat dit bestand ongewijzigd. Je bouwt de herbruikbare functies in catalog_db.py. Wanneer je op Run drukt, maakt run_boundary.py tijdelijke voorbeeldgegevens aan, voert het precies de hier getoonde aanroep uit en drukt het af wat je functie daadwerkelijk heeft teruggegeven. Het slaat geen databasebestand op in je project.
Open catalog_db.py. De huidige functie geeft de waarde van execute() rechtstreeks terug:
def list_available_items(connection):
return connection.execute("""
SELECT items.id, items.asset_tag, items.name, items.category, items.loan_days
FROM items
LEFT JOIN loans
ON loans.item_id = items.id AND loans.returned_on IS NULL
WHERE loans.id IS NULL
ORDER BY items.asset_tag
""")
Die waarde is een Cursor: het resultaatobject van SQLite voor deze uitvoering. Het kan rijen opleveren, maar is zelf niet de lijst met rijen. Geef het eerst een naam en vraag vervolgens alle resterende rijen op:
result = connection.execute("""complete query here""")
rows = result.fetchall()
return result, rows
Het paar is tijdelijk. Door beide objecten terug te geven, zie je het verschil voordat je vereenvoudigt wat de functie aan haar aanroeper teruggeeft. Voer niet eerst fetchone() uit: daarmee zou je één rij verbruiken, zodat fetchall() alleen de resterende rijen ontvangt.
Druk op Run. Het roept list_available_items(connection) één keer aan. Je uitvoer benoemt de buitenste tuple, de Cursor, de lengte van de afzonderlijke lijst en de vijf waarden van de eerste tuple. Je zou ook de vier rijen op volgorde van inventariscode moeten zien.
Submit controleert andere cataloguswaarden en een andere invoegvolgorde, met een actieve uitlening, afgeronde uitleengeschiedenis en een voorwerp dat nooit is uitgeleend. Het roept de functie twee keer aan via dezelfde meegegeven verbinding. Geef het werkelijke resultaat en de opgehaalde rijen terug; laat de verbinding open voor de aanroeper.
Opdracht
Maak list_available_items(connection) in catalog_db.py af.
Sla het object dat de meegeleverde query teruggeeft op als result, roep result.fetchall() één keer aan om rows te maken en geef (result, rows) terug. Laat de query ongewijzigd en de meegegeven verbinding open.