Ein Schema erstellen, Daten importieren und das Schema weiterentwickeln · Übung
Jede CSV-Zeile vor dem Schreiben validieren
Der CSV-Reader hat belegt, dass jede Zeile fünf Zellen hat, aber "0", " " und ein wiederholtes Inventarkennzeichen haben trotzdem die richtige Form. Wandle jetzt den vollständigen unverarbeiteten Datenstapel in Werte um, die sicher an die Datenbank übergeben werden können.
Vervollständige validate_item_rows(rows) in catalog_import.py. Run kombiniert die beiden Funktionen ausdrücklich:
validate_item_rows(read_item_rows(Path("data/items.csv")))
Eine gültige Zeile wird zu einem Tupel mit fünf Werten in dieser Reihenfolge: ganzzahlige ID, bereinigtes Inventarkennzeichen, bereinigter Name, bereinigte Kategorie, ganzzahlige Leihtage. Run gibt aus:
== validate every row ==
Call: validate_item_rows(read_item_rows(Path("data/items.csv")))
(1, 'TL-100', 'Cordless drill', 'tools', 7)
(2, 'EV-200', 'Folding table', 'events', 14)
(3, 'EL-300', 'Projector', 'electronics', 3)
Repeated TL-100 -> Error: CSV contains asset tag TL-100 more than once.
Entferne bei id und loan_days umgebende Leerraumzeichen und akzeptiere nur dezimale ASCII-Ziffern, deren umgewandelte ganze Zahl größer als null ist. Das lehnt absichtlich Vorzeichen, Dezimalzahlen, null, negative Zahlen und ähnlich aussehende Unicode-Ziffern ab. Entferne bei asset_tag, name und category umgebende Leerraumzeichen und lehne ein Ergebnis ohne Zeichen ab.
Halte getrennte Sets für umgewandelte IDs und bereinigte Kennzeichen. Der Duplikatvergleich muss nach Umwandlung und Bereinigung stattfinden: "01" und "1" haben dieselbe ID, während " TL-100 " und "TL-100" dasselbe Kennzeichen haben. Nenne im Duplikatfehler den normalisierten Wert.
Baue das Ergebnis lokal auf und gib es erst zurück, nachdem jede Zeile bestanden hat. Das ist ein reiner Vorbereitungsschritt: Er erhält Dictionaries und gibt Tupel zurück. Er hat weder einen Datenbankpfad noch eine Verbindung, über die er schreiben könnte. Diese Trennung ermöglicht es, dass eine spätere ungültige Zeile den Import stoppt, bevor die Datenbank überhaupt geöffnet wurde.
Verwende die angezeigte Zeilennummer auch bei Wertfehlern. Eine Meldung wie CSV row 4 loan days must be a positive integer. verweist auf die Quelle und hält zugleich die Regel ausdrücklich fest. Überspringe niemals stillschweigend eine ungültige Zeile: Ein fragwürdiger Datensatz macht den gesamten übergebenen Datenstapel ungeeignet zum Schreiben.
Aufgabe
Vervollständige validate_item_rows(rows) in catalog_import.py.
Gib Tupel mit fünf Werten in Eingabereihenfolge zurück. Verlange positive ASCII-Ganzzahlen für IDs und Leihtage, bereinigten nicht leeren Text sowie eindeutige umgewandelte IDs und bereinigte Inventarkennzeichen. Validiere den vollständigen Datenstapel, ohne eine Datenbank zu öffnen oder zu ändern.