0%

Tabellen verknüpfen, statt Daten zu wiederholen · Übung

Fremdschlüsselprüfungen einschalten

Das Schema sagt jetzt, wohin jede ID im Ausleihvorgang führen muss. Eine Standardverbindung meldete weiterhin foreign_keys: 0, also setzte SQLite diese Zusagen nicht durch. Die Einstellung gehört zur Verbindung, nicht zur Schemadatei.

Öffne connections.py. Die Funktion open_database(database_path) öffnet bereits den empfangenen Pfad und gibt die offene Verbindung zurück. Füge zwischen diesen beiden Aktionen diese Zeile ein:

connection.execute("PRAGMA foreign_keys = ON")

PRAGMA ist SQLites Anweisung zum Lesen oder Ändern einer Datenbankeinstellung. Diese aktiviert die Fremdschlüsseldurchsetzung für diese Verbindung. Halte die Anweisung statisch. Sie enthält keinen von Lernenden kontrollierten Wert, der gebunden werden müsste.

Klicke auf Run. run_relationships.py erstellt eine temporäre Datenbank, ruft deine Funktion zweimal mit demselben angezeigten database_path auf und fragt jede zurückgegebene Verbindung nach ihrer Einstellung. Danach versucht es einen Ausleihvorgang mit einer nicht vorhandenen Gegenstands-ID.

Die wichtigen Zeilen sind diese:

first foreign_keys: 1
missing item: IntegrityError
second foreign_keys: 1
first still open: yes
second still open: yes

Die beiden Werte 1 sind unabhängig voneinander wichtig. Die Prüfung für first einzuschalten aktiviert sie nicht für second, obwohl beide Verbindungen dieselbe Datenbankdatei öffnen. Jeder Aufruf von open_database muss die neue Verbindung konfigurieren, die er erstellt.

Deine Funktion lässt außerdem beide Verbindungen offen. Eine Verbindung zu öffnen überträgt die Verantwortung für ihren Lebenszyklus an den aufrufenden Code. Dieser kann Abfragen ausführen und sie später schließen. Eine geschlossene Verbindung zurückzugeben oder eine globale Verbindung zu behalten und wiederholt zurückzugeben würde diese Zusage brechen.

Submit ruft open_database mit unterschiedlichen Pfaden und Daten auf. Es prüft fehlende Gegenstände und Mitglieder separat, speichert einen gültigen Ausleihvorgang und führt danach eine harmlose Abfrage aus. Sobald das gelingt, arbeiten Schemadeklaration und Verbindungseinstellung zusammen: Die Tabelle beschreibt die Beziehungen, und jede von deiner Funktion geöffnete Verbindung setzt sie durch.

Aufgabe

Vervollständige open_database(database_path) in connections.py. Aktiviere die SQLite-Fremdschlüsselprüfungen auf der neuen Verbindung, bevor du sie zurückgibst.

Klicke auf Run und bestätige, dass zwei separate Aufrufe beide foreign_keys: 1 melden, ein fehlender Gegenstand IntegrityError auslöst und beide zurückgegebenen Verbindungen verwendbar bleiben.