0%

Kapitel 9 · Übung

Ein Schema erstellen, Daten importieren und das Schema weiterentwickeln

Das Schema aus dem Quellcode neu aufbauen

Ein leerer Datenbankpfad ist noch keine Verleihdatenbank. Er braucht jedes Mal dieselben drei Tabellen und Regeln, auch wenn keine frühere .db-Datei zum Kopieren verfügbar ist.

Vier Dateien sind in diesem Projekt sichtbar:

DateiAufgabe
catalog_setup.pyDie Datei, die du bearbeitest, um das Schema zu erstellen und später zu aktualisieren.
catalog_db.pyDie fertigen Abfrage- und Befehlsfunktionen, die du bereits gebaut hast. Lass sie unverändert.
data/items.csvDie Gegenstandsdatensätze, die du später importierst.
run_setup.pyDas sichtbare Programm, das Run ausführt, um deine Funktionen mit temporären Datenbanken aufzurufen.

Öffne catalog_setup.py. Die drei Strings mit CREATE TABLE enthalten bereits den aktuellen Entwurf. Version 2 behält die bekannten Tabellen items und loans bei und ergänzt email TEXT, das fehlende Werte erlaubt, als letzte Spalte von members.

Deine Arbeit gehört in create_current_schema(connection). Die Funktion erhält eine offene Verbindung. Führe zuerst BEGIN aus, danach jede der drei Tabellenanweisungen separat. Wenn jede Anweisung gelingt, rufe connection.commit() auf. Wenn eine Anweisung eine Ausnahme auslöst, rufe connection.rollback() auf und lass diese ursprüngliche Ausnahme weiterlaufen.

Warum BEGIN selbst schreiben? Ein SQLite-Verbindungskontext kann bei Datenänderungen zwischen Commit und Rollback entscheiden, aber er beginnt diese Folge von Tabellenerstellungsanweisungen nicht für dich. Ohne ausdrücklichen Start kann ein späterer Fehler eine frühere Tabelle zurücklassen. Hier brauchen alle drei Tabellen ein gemeinsames Ergebnis.

Schließe die Verbindung nicht. Der aufrufende Code hat sie übergeben und bleibt für ihren Lebenszyklus verantwortlich.

Klicke auf Run. run_setup.py öffnet eine neue Verbindung zu einer Datenbank im Arbeitsspeicher und ruft genau Folgendes auf:

create_current_schema(connection)

Der neue Block sollte so enden:

== rebuild the schema ==
Call: create_current_schema(connection)
Tables: items, loans, members
Members columns: id, member_code, name, loan_limit, email
Schema version: 0
Transaction still open: no

Die Version bleibt absichtlich 0. Du hast die Erstellung atomar gemacht; jetzt braucht genau dieses Schema eine gespeicherte Version.

Submit erzeugt außerdem absichtlich einen späten Konflikt. Wenn members bereits existiert, scheitert die zweite Erstellung. Ein korrektes Rollback entfernt die zuvor im selben Versuch erstellte Tabelle items, während die bereits vorhandene Tabelle erhalten bleibt.

Aufgabe

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

Führe ein statisches BEGIN aus, danach die vorgegebenen Anweisungen ITEMS_SQL, MEMBERS_SQL und LOANS_SQL. Schreibe einmal fest, nachdem alle drei gelungen sind. Rolle bei einer Ausnahme zurück und lass dieselbe Ausnahme weiterlaufen. Lass die übergebene Verbindung offen.

Klicke auf Run und bestätige, dass alle drei Tabellen erscheinen, email die letzte Mitgliederspalte ist, die Version weiterhin 0 beträgt und keine Transaktion offen bleibt.