Ein Schema erstellen, Daten importieren und das Schema weiterentwickeln · Übung
Eine Version ablehnen, die nicht zu ihrer Struktur passt
Eine Versionsnummer ist nur ein Teil der Belege. Eine Datei kann Version 1 behaupten, obwohl sie members.email bereits enthält, oder Version 2, obwohl eine Tabelle fehlt. Eine Migration auf einer dieser Dateien auszuführen könnte den Schaden vergrößern.
Vervollständige prepare_database(database_path) in catalog_setup.py. Der aufrufende Code übergibt den exakten Pfad. Deine Funktion öffnet diesen Pfad, liest PRAGMA user_version, liest die Namen der Benutzertabellen und liest die geordneten Spalten mit den drei festen PRAGMA table_info(...)-Anweisungen aus dem Startcode.
Entscheide über die gesamte Aktion, bevor du etwas änderst:
Version 0 ohne Benutzertabellen ist leer, also erstelle Version 2.
Version 0 mit irgendeiner Benutzertabelle ist unbekannt. Löse
ValueError("Database has tables but no schema version.")aus.Die exakte Struktur der Version 1 wird einmal migriert.
Die exakte Struktur der Version 2 ist bereits bereit und bleibt unberührt.
Jede andere Markierung löst
ValueError("Schema version N is not supported.")aus.Version 1 oder 2 mit anderen Tabellen oder anders geordneten Spalten löst
ValueError("Schema version N does not match the expected tables and columns.")aus.
Hier ist dieselbe Entscheidung auf vier sichere Wege verdichtet. Auf jedem Weg werden Version und tatsächliche Struktur gemeinsam geprüft:

Run verwendet vier temporäre Pfade und ruft dieselbe Funktion als prepare_database(missing_path), prepare_database(version_one_path), prepare_database(version_two_path) und prepare_database(mismatched_path) auf:
== guard schema compatibility ==
missing database -> version 2
exact version 1 -> version 2; M-17 email NULL
exact version 2 -> unchanged; M-18 email alex@example.com
mismatched version 1 -> Error: Schema version 1 does not match the expected tables and columns.
Auch eine zusätzliche Tabelle zählt als Abweichung. Die Reihenfolge der Spalten ist wichtig, weil eine geänderte Reihenfolge ein anderes Schema erkennen lassen kann, auch wenn die Namen dieselbe Menge bilden.
Schließe jede Verbindung, die diese für den Pfad verantwortliche Funktion öffnet, auch bei einer Ablehnung. Baue eine aktuelle Datenbank nicht neu auf und migriere nicht, bevor ihre Version-1-Struktur die vollständige Prüfung bestanden hat. Eine Ablehnung soll unspektakulär sein: Markierung, Spalten und Zeilen bleiben genau wie zuvor.
Diese vorhersehbare Ablehnung gibt dem aufrufenden Code eine präzise Wahl zur Wiederherstellung statt einer teilweise veränderten Datei.
Aufgabe
Vervollständige prepare_database(database_path) in catalog_setup.py.
Implementiere genau die oben beschriebenen Entscheidungen für leere Datenbanken, Tabellen ohne Version, Version 1, Version 2, nicht unterstützte Versionen und Abweichungen zwischen Markierung und Struktur. Untersuche vor der Migration alle drei Tabellen und ihre geordneten Spalten. Schließe die Verbindung in finally und ändere niemals eine abgelehnte Datenbank.