Kapitel 8 · Übung
Eine Python-Schnittstelle um die Datenbank legen
Alle Zeilen eines Ergebnisses abholen
Run beginnt mit vier verfügbaren Katalogzeilen:
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
Die Abfrage findet sie bereits. Betrachte jetzt die beiden Python-Objekte, die am Abrufen beteiligt sind.
Dein Arbeitsbereich hat drei sichtbare Dateien. schema.sql erstellt die bereits bekannten Tabellen items, members und loans neu. Lass sie unverändert. In catalog_db.py baust du die wiederverwendbaren Funktionen. Wenn du auf Run klickst, erstellt run_boundary.py temporäre Beispieldaten, führt den hier gezeigten exakten Aufruf aus und gibt aus, was deine Funktion tatsächlich zurückgegeben hat. Es speichert keine Datenbankdatei in deinem Projekt.
Öffne catalog_db.py. Die aktuelle Funktion gibt den Wert von execute() direkt zurück:
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
""")
Dieser Wert ist ein Cursor: SQLites Ergebnisobjekt für diese Ausführung. Es kann Zeilen liefern, ist aber nicht selbst die Liste der Zeilen. Gib ihm zuerst einen Namen und fordere dann alle verbleibenden Zeilen an:
result = connection.execute("""complete query here""")
rows = result.fetchall()
return result, rows
Das Paar ist vorübergehend. Beide Objekte zurückzugeben lässt dich den Unterschied sehen, bevor du das öffentliche Ergebnis der Funktion vereinfachst. Führe nicht zuerst fetchone() aus: Das würde eine Zeile verbrauchen, sodass fetchall() nur noch den Rest erhielte.
Klicke auf Run. Es ruft list_available_items(connection) einmal auf. Deine Ausgabe identifiziert das äußere Tupel, den Cursor, die Länge der separaten Liste und die fünf Werte des ersten Tupels. Du solltest auch die vier Zeilen in Inventarkennzeichen-Reihenfolge sehen.
Submit prüft andere Katalogwerte und eine andere Einfügereihenfolge, einschließlich eines aktiven Ausleihvorgangs, zurückgegebenen Verlaufs und eines noch nie ausgeliehenen Gegenstands. Es ruft die Funktion zweimal über dieselbe übergebene Verbindung auf. Gib das tatsächliche Ergebnis und die abgeholten Zeilen zurück und lass die Verbindung für den aufrufenden Code offen.
Aufgabe
Vervollständige list_available_items(connection) in catalog_db.py.
Speichere das von der vorgegebenen Abfrage zurückgegebene Objekt als result, rufe result.fetchall() einmal auf, um rows zu erstellen, und gib (result, rows) zurück. Behalte die Abfrage unverändert bei und lass die übergebene Verbindung offen.