0%

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

Eine leere Datenbank von einer unbekannten unterscheiden

Eine mit Version 0 markierte Datenbank ist nicht automatisch leer. Jemand könnte eine Tabelle erstellt haben, ohne eine Version festzuhalten. Einrichtungscode darf diesen unbekannten Zustand nicht überschreiben.

Der entscheidende Nachweis ist die Liste der Anwendungstabellen. SQLite hält Schemaeinträge in sqlite_schema, also zeigt diese Abfrage die Namen in stabiler Reihenfolge:

SELECT name
FROM sqlite_schema
WHERE type = 'table'
ORDER BY name;

Öffne catalog_setup.py und vervollständige user_table_names(connection). Führe genau diese Abfrage aus, rufe fetchall() auf und baue eine Namensliste. SQLite kann eigene Tabellen erstellen, deren Namen mit sqlite_ beginnen. Schließe diese in Python mit name.startswith("sqlite_") aus. Füge dem SQL kein LIKE hinzu.

Gib die verbleibenden Namen in der Reihenfolge der Abfrage zurück. Das Ergebnis hat für spätere Einrichtungsentscheidungen eine präzise Bedeutung:

  • [] zusammen mit Version 0 bedeutet, dass die Datenbank leer ist und sicher initialisiert werden kann.

  • Jeder Name einer Benutzertabelle zusammen mit Version 0 bedeutet, dass die Datenbank unbekannt ist und abgelehnt werden muss.

Dieser zweite Fall schützt Daten. Eine Tabelle namens notes könnte zu einem anderen Programm oder einem manuellen Versuch gehören. Sie wegen der Markierung 0 leer zu nennen würde dem Initialisierer erlauben, eine Datei zu beanspruchen, die er nicht versteht.

Klicke auf Run. run_setup.py ruft auf:

user_table_names(blank_connection)
user_table_names(current_connection)

Der neue Block sollte Folgendes zeigen:

== distinguish blank from unknown ==
Call: user_table_names(blank_connection)
User tables: []
Call: user_table_names(current_connection)
User tables: ['items', 'loans', 'members']

Die Funktion beobachtet nur. Sie erstellt, löscht, benennt oder versioniert nichts und lässt die Verbindung offen.

Submit gibt dir außerdem eine Datenbank mit einer Anwendungstabelle und SQLites eigener Tabelle sqlite_sequence. Die Anwendungstabelle muss sichtbar bleiben, während der interne Name aus dem Ergebnis ausgeschlossen wird. So bleibt „leer“ an den Zustand gebunden, für den dein Programm verantwortlich ist.

Weil diese Prüfung nur liest, kann aufrufender Code eine unbekannte Datei untersuchen und entscheiden, was zu tun ist, ohne vorher die Belege zu verändern.

Aufgabe

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

Führe die angezeigte sqlite_schema-Abfrage aus, hole jede Zeile ab und gib die Namen in Reihenfolge zurück. Lass in Python Namen aus, die mit sqlite_ beginnen. Verwende kein LIKE und ändere oder schließe die Datenbank nicht.

Klicke auf Run und bestätige, dass eine leere Verbindung [] zurückgibt, während das aktuelle Schema ['items', 'loans', 'members'] zurückgibt.