Ein Schema erstellen, Daten importieren und das Schema weiterentwickeln · Abschlussprojekt
Abschlussprojekt: Projekt: Einen Katalog aus Quelldateien vorbereiten
Die Teile haben jetzt klare Aufgaben. catalog_setup.py entscheidet, ob eine Datenbank das aktuelle Schema erhalten darf. catalog_import.py liest und validiert eine vollständige CSV-Datei und wendet dann eine idempotente Transaktion an. Das Projekt ergänzt eine für den Pfad verantwortliche Funktion, die beides kombiniert, ohne eine der Grenzen abzuschwächen.
Vervollständige:
import_items_csv(database_path, csv_path)
Wandle zuerst database_path in Path um und lehne einen fehlenden Pfad mit ValueError("Database does not exist. Run init first.") ab. Nur der ausdrückliche Einrichtungsaufruf darf eine neue Datei erstellen. Führe als Nächstes read_item_rows(csv_path) und validate_item_rows(rows) vollständig aus. Diese Reihenfolge ist wichtig: Eine ungültige CSV-Datei darf keine ansonsten gültige Datenbank der Version 1 migrieren.
Rufe nach erfolgreicher Vorbereitung prepare_database(database_path) auf. Öffne dann mit open_database(database_path) eine konfigurierte Anwendungsverbindung, übergib sie und die vorbereiteten Tupel an import_staged_items und gib dessen zwei Anzahlen zurück. Schließe diese Verbindung in finally, unabhängig davon, ob der Import zurückkehrt oder einen Fehler auslöst.
Run verwendet einen neuen temporären database_path. Es ruft prepare_database(database_path) auf und danach zweimal import_items_csv(database_path, Path("data/items.csv")):
== prepare a catalog from source ==
Call: prepare_database(database_path)
Schema version: 2
First import: inserted 3, unchanged 0
Second import: inserted 0, unchanged 3
Items after reopening: 3
Der erste angezeigte Aufruf ist die separate Einrichtungsgrenze. Die umschließende Funktion lehnt es bewusst ab, die Erstellung in einem Importbefehl zu verstecken. Das gibt einem zukünftigen Kommandozeilenprogramm eine ausdrückliche Aktion init und macht einen falsch geschriebenen Datenbankpfad sicher.
Versuche, dieses Projekt als Folge von Verantwortungsübergaben zu lesen. Der CSV-Reader verwaltet seinen Dateizugriff. prepare_database verwaltet seine Einrichtungsverbindung. import_items_csv verwaltet seine Anwendungsverbindung. Die Transaktionsfunktion lässt eine übergebene Verbindung offen. Jeder Verantwortliche schließt nur, was er selbst geöffnet hat.
Behalte die Importgrenze mit fünf Feldern unverändert bei. Insbesondere zeigt die neue Spalte members.email später, dass die Migration einen sichtbaren Zweck hatte. Gegenstands-CSV-Daten dürfen aber niemals Mitgliederzeilen oder E-Mail-Adressen schreiben.
Run öffnet die Datei erneut, bevor es die endgültige Anzahl meldet. Diese drei Zeilen sind daher dauerhaft gespeichert und nicht nur über eine Verbindung sichtbar.
Aufgabe
Vervollständige import_items_csv(database_path, csv_path) in catalog_import.py.
Lehne eine fehlende Datenbank ab, lies und validiere die CSV-Datei vollständig vor der Einrichtung, rufe prepare_database auf, öffne eine konfigurierte Verbindung, rufe import_staged_items auf und schließe in finally. Gib die Anzahlen eingefügter und unveränderter Zeilen zurück, ohne Programmierfehler abzufangen.