0%

Eine Python-Schnittstelle um die Datenbank legen · Übung

Jede Verbindung einmal konfigurieren

Zwei Einstellungen sollten gelten, bevor die Katalogarbeit beginnt:

foreign_keys: 1
selected row type: Row

Derzeit merkt sich list_available_items die zweite Einstellung, während jede andere Abfrage oder jeder andere Befehl erneut daran denken müsste. Für die Fremdschlüsseldurchsetzung gilt dieselbe Regel pro Verbindung. Eine Öffnungsfunktion kann beide Zusagen einmal machen.

Öffne catalog_db.py. Füge die beiden Einstellungen innerhalb der vorgegebenen Funktion open_database(database_path) zwischen sqlite3.connect(database_path) und return connection hinzu:

def open_database(database_path):
    connection = sqlite3.connect(database_path)
    connection.execute("PRAGMA foreign_keys = ON")
    connection.row_factory = sqlite3.Row
    return connection

Entferne dann diese Zeile aus list_available_items:

connection.row_factory = sqlite3.Row

Behalte dessen Abfrage, result, fetchall() und die vorübergehende Rückgabe (result, rows) bei. Der Zeilentyp ändert sich nicht: Run übergibt jetzt eine Verbindung, die open_database bereits konfiguriert hat. Die Einstellung zu verschieben ist wichtig, weil die Abfragefunktion sich auf ihre Abfrage konzentrieren kann, statt stillschweigend die Verbindung des aufrufenden Codes zu verändern.

open_database hat eine eng begrenzte Aufgabe. Es öffnet den vom aufrufenden Code gelieferten Pfad, aktiviert sofort Fremdschlüsselprüfungen, wählt benannte Zeilen und gibt die offene Verbindung zurück. Es erstellt keine Tabellen, lädt keine Beispieldaten, schreibt nicht fest, rollt nicht zurück und schließt nicht. Diese Aktionen gehören zu aufrufendem Code mit mehr Kontext.

Die Reihenfolge vermeidet außerdem zwei SQLite-Überraschungen. Eine vor der Row-Factory-Zuweisung ausgeführte Abfrage würde weiterhin positionale Tupel erzeugen, und nach Beginn einer Transaktion aktivierte Fremdschlüsseldurchsetzung wirkt sich möglicherweise nicht auf diese Transaktion aus. Konfiguriere zuerst und verwende die Verbindung danach.

Klicke auf Run. Der vorhandene Listenaufruf verwendet jetzt open_database(database_path). Ein zweiter sichtbarer Block macht das Ergebnis dieser Funktion konkret:

open_database(database_path)
foreign_keys: 1
selected row type: Row
selected item: IT-100 | Cordless drill
connection still open: yes

Submit öffnet mit deiner Funktion zwei unterschiedliche temporäre Pfade. Es prüft beide Einstellungen vor der Datenbankarbeit, erstellt Tabellen, bestätigt die Ablehnung eines fehlenden Verweises, liest eine Spalte über ihren Namen und verwendet jede Verbindung erneut. Außerdem prüft es, dass list_available_items keine Row Factory mehr zuweist. Gib die Verbindung zurück; der aufrufende Code schließt sie.

Aufgabe

Vervollständige open_database(database_path), sodass jede neue Verbindung Fremdschlüsselprüfungen aktiviert und sqlite3.Row verwendet und anschließend diese offene Verbindung zurückgegeben wird.

Entferne connection.row_factory = sqlite3.Row aus list_available_items; die Verbindungseinrichtung gehört jetzt ausschließlich in open_database. Erstelle in keiner der Funktionen Tabellen, schreibe nicht fest und schließe nicht.