0%

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

Die Schemaversion festhalten

Zwei Datenbanken können unterschiedliche Generationen derselben Anwendungstabellen enthalten. Nur einen Dateinamen wie catalog.db zu betrachten sagt deinem Einrichtungscode nicht, welche Generation er geöffnet hat.

SQLite stellt für diese Aufgabe eine kleine ganze Zahl bereit: PRAGMA user_version. Sie lebt innerhalb der Datenbankdatei, beginnt bei 0 und steht einer Anwendung zur Verwaltung zur Verfügung. SQLite legt ihre Bedeutung nicht fest. In diesem Projekt bedeutet 2 die aktuelle Form mit drei Tabellen und members.email als letzter Spalte.

Öffne catalog_setup.py. Nimm zwei gezielte Änderungen vor.

Bearbeite zuerst dein gespeichertes create_current_schema(connection). Führe nach allen drei erfolgreichen CREATE TABLE-Aufrufen, aber vor dem bestehenden Commit, diese statische Anweisung aus:

connection.execute("PRAGMA user_version = 2")

Die Version innerhalb derselben Transaktion zu schreiben ist wichtig. Wenn eine Tabellenerstellung scheitert, sollte das Rollback sowohl das Schema als auch seine Versionsmarkierung unverändert lassen.

Vervollständige dann die neue Funktion schema_version(connection). Führe die statische Leseanweisung PRAGMA user_version aus, hole ihre eine Zeile ab und gib die ganze Zahl aus dieser Zeile zurück. Gib nicht das Python-Literal 2 zurück. Die Funktion muss melden, was die jeweils empfangene Datenbank enthält.

Klicke auf Run. Das sichtbare run_setup.py führt jetzt diese Aufrufe aus:

create_current_schema(current_connection)
schema_version(current_connection)
schema_version(version_seven_connection)

Die zweite Verbindung ist absichtlich mit 7 markiert, also lautet die wichtige Ausgabe:

== record the version ==
Call: schema_version(current_connection)
Current schema version: 2
Call: schema_version(version_seven_connection)
Other stored version: 7

Du wirst außerdem sehen, dass der frühere Neuaufbaublock Schema version: 2 meldet. Das Ausführungsprogramm ruft denselben gespeicherten Initialisierer erneut auf und gibt aus, was die Datenbank tatsächlich enthält. Es bewahrt kein altes Ergebnis aus einem früheren Durchlauf auf.

Submit öffnet eine neu initialisierte Datei erneut und liefert außerdem Verbindungen mit den Markierungen 1, 2 und 7. Danach erzwingt es einen späten Schemafehler. Dieser fehlgeschlagene Aufruf muss seine Version weiterhin bei 0 lassen. Das belegt, dass die Markierung ein fertiggestelltes Schema beschreibt, nicht einen Versuch.

Die Markierung wird mit der Datenbankdatei mitgenommen.

Aufgabe

Schreibe in catalog_setup.py das PRAGMA user_version = 2 innerhalb von create_current_schema(connection) vor dessen bestehendem Commit.

Vervollständige dann schema_version(connection), sodass es PRAGMA user_version ausführt, die eine Zeile abholt und deren ganze Zahl zurückgibt. Halte beide PRAGMA-Anweisungen statisch und lass die Verbindung offen.

Klicke auf Run und achte auf die aktuelle Version 2 und die separat gespeicherte Version 7.