0%

Ein Schema erstellen, Daten importieren und das Schema weiterentwickeln · Übung

Version 1 weiterentwickeln

Ein Katalog kann die erste Version seines Schemas überdauern. Angenommen, catalog.db enthält Mitglied 17 bereits als Riley Chen und hat die gespeicherte Version 1. Alle drei Tabellen neu aufzubauen würde diese echte Zeile gefährden. Deine Aufgabe in catalog_setup.py ist kleiner: Verändere genau diese alte Form an Ort und Stelle.

Run ruft migrate_v1_to_v2(connection) mit einer offenen Verbindung zu einer temporären Datenbank der Version 1 auf. Die vorgegebene Einrichtung hat vor deinem Aufruf diese Mitgliederspalten:

id, member_code, name, loan_limit

Nach einem erfolgreichen Aufruf schließt Run die Datei und öffnet sie erneut. Es sollte Folgendes zeigen:

== move version 1 forward ==
Before: version 1; member columns id, member_code, name, loan_limit
Call: migrate_v1_to_v2(connection)
After: version 2; member columns id, member_code, name, loan_limit, email
M-17: Riley Chen | email NULL

Verwende die drei SQL-Strings, die bereits in migrate_v1_to_v2 stehen: Starte eine Transaktion, füge email TEXT zu members hinzu und halte dann Version 2 fest. Rufe commit() einmal auf, nachdem beide Änderungen gelungen sind. Wenn eine der Änderungen scheitert, rufe rollback() auf und lass die ursprüngliche Ausnahme weiterlaufen.

SQLite füllt die neue Spalte, die fehlende Werte erlaubt, für bestehende Zeilen mit NULL. Deshalb bleiben Rileys Name und alle anderen gespeicherten Werte erhalten, während die neue E-Mail-Adresse zunächst fehlt. Das ist eine Vorwärtsmigration: Sie kennt eine alte Form und überführt sie in eine aktuelle Form. Sie versucht nicht zu erraten, wie beliebige Datenbanken repariert werden können.

Das ausdrückliche BEGIN ist hier aus demselben Grund wichtig wie bei der Initialisierung. Die DDL-Folge muss bereits innerhalb einer Transaktion liegen, bevor die erste Schemaänderung läuft. Ein Verbindungskontext allein startet diese konkrete DDL-Folge nicht früh genug.

Lass die übergebene Verbindung offen. Der aufrufende Code hat den Pfad gewählt und verwaltet ihren Lebenszyklus. Diese Funktion ist nur für die Migrationstransaktion verantwortlich.

Run verwendet eine temporäre Datei, also beginnt jeder Klick erneut mit derselben sicheren Zeile der Version 1.

Aufgabe

Vervollständige migrate_v1_to_v2(connection) in catalog_setup.py.

Führe BEGIN aus, füge members.email mit erlaubten fehlenden Werten hinzu, setze PRAGMA user_version = 2 und schreibe einmal fest. Rolle bei jeder Ausnahme zurück und löse sie erneut aus. Erhalte alle bestehenden Zeilen und lass die übergebene Verbindung offen.