Eine Python-Schnittstelle um die Datenbank legen · Übung
Ergebnisspalten über ihren Namen lesen
Die erste verfügbare Zeile erscheint derzeit als positionales Tupel:
(1, 'IT-100', 'Cordless drill', 'tools', 7)
Du weißt nur deshalb, dass Index 1 das Inventarkennzeichen ist, weil du die SELECT-Liste sehen kannst. Aufrufender Code, der row[1] schreibt, hängt stillschweigend von dieser Reihenfolge ab. Diese Variante sagt, was sie meint:
row["asset_tag"]
row["name"]
SQLite kann diesen Zugriff über Namen mit sqlite3.Row bereitstellen. Die Einstellung gehört zur Verbindung und muss gesetzt sein, bevor die Abfrage ausgeführt wird:
connection.row_factory = sqlite3.Row
result = connection.execute("""complete query here""")
Öffne catalog_db.py. Behalte das SQL für verfügbare Gegenstände, result, fetchall() und die vorübergehende Rückgabe (result, rows) genau bei. Füge die Zuweisung der Row Factory unmittelbar vor result = connection.execute(...) hinzu.
Die beiden Objekte bleiben unterschiedlich. result ist weiterhin ein Cursor. Jeder Wert innerhalb von rows ist jetzt eine Row. Eine Row ist kein Dictionary, obwohl sie sowohl Positionen als auch ausgewählte Spaltennamen unterstützt. Mit row = rows[0] beziehen sich alle diese Ausdrücke auf Werte aus der Abfrage:
row["id"]
row["asset_tag"]
row["name"]
row["category"]
row["loan_days"]
Klicke auf Run. Es führt denselben Aufruf wie zuvor aus: list_available_items(connection). Die äußere Rückgabe bleibt ein Tupel, der Ergebnistyp bleibt Cursor und die Zeilenanzahl bleibt vier. Die geänderte Zeile ist konkret:
First row type: Row
First row values: 1 | IT-100 | Cordless drill | tools | 7
Die Reihenfolge dieser ausgegebenen Werte stammt weiterhin aus der exakten Abfrage, während dein Python-Code jetzt ihre Namen verwenden kann. Dadurch wird es viel unwahrscheinlicher, dass eine spätere Änderung der ausgewählten Spaltenreihenfolge dem aufrufenden Code unbemerkt den falschen Wert liefert.
Submit liefert eine Standardverbindung, also muss die Funktion diesen Schritt selbst konfigurieren. Es probiert außerdem ein leeres Verfügbarkeitsergebnis aus und prüft, dass du eine leere Zeilenliste zurückgibst, statt bei rows[0] zu scheitern. Lass die Verbindung offen. Als Nächstes verschiebst du diese Einstellung an die eine Stelle, an der Verbindungen geöffnet werden.
Aufgabe
Aktualisiere list_available_items(connection), sodass es vor dem Aufruf von execute() die Einstellung connection.row_factory = sqlite3.Row setzt.
Behalte die Abfrage und die vorübergehende Rückgabe (result, rows) unverändert bei. Die zurückgegebene Liste muss sqlite3.Row-Werte enthalten, die alle fünf ausgewählten Spaltennamen unterstützen, und die übergebene Verbindung muss offen bleiben.