0%

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.