Ein Schema erstellen, Daten importieren und das Schema weiterentwickeln · Übung
Einen exakt wiederholten Import ohne Änderung lassen
Denselben vertrauenswürdigen Import zweimal auszuführen soll weder Duplikate erzeugen noch scheitern. Aber „derselbe“ muss mehr bedeuten, als dasselbe Kennzeichen zu finden. Öffne dein gespeichertes import_staged_items(connection, items) und verbessere die Entscheidung innerhalb seiner bestehenden Transaktion.
Wähle für jedes eingehende Tupel zuerst alle fünf vom CSV verwalteten Felder anhand des Inventarkennzeichens aus. Es gibt drei Ergebnisse:
Wenn jeder ausgewählte Wert dem eingehenden Tupel entspricht, schreibe nichts und erhöhe
unchanged.Wenn das Kennzeichen existiert, aber ein verwaltetes Feld abweicht, löse
ValueError("CSV item TAG disagrees with the stored item.")aus.Wenn das Kennzeichen neu ist, prüfe seine eingehende ID. Wenn ein anderes Kennzeichen diese ID verwendet, löse
ValueError("CSV item TAG uses an ID that belongs to another item.")aus; füge es andernfalls ein.
Halte beide Auswahlen und die Einfügung parametrisiert. Aktualisiere oder lösche keine bestehende Zeile. Ein CSV verwaltet genau diese fünf Felder, also verwendet ein exakter Vergleich alle fünf in ihrer deklarierten Reihenfolge.
Run wiederholt die exakten Aufrufe, die du gerade gesehen hast. Nur die beobachteten Entscheidungen ändern sich:
== import staged items ==
First call: import_staged_items(connection, staged_items)
First result: (3, 0)
1 | TL-100 | Cordless drill | tools | 7
2 | EV-200 | Folding table | events | 14
3 | EL-300 | Projector | electronics | 3
Exact-repeat call: import_staged_items(connection, staged_items)
Exact-repeat result: (0, 3)
Changed-row call: import_staged_items(connection, changed_items)
Changed-row result: ValueError: CSV item TL-100 disagrees with the stored item.
Items after reopening: 3
Diese Eigenschaft heißt Idempotenz: Sobald ein exakter Datenstapel importiert wurde, erreicht seine Wiederholung denselben gespeicherten Zustand. Die Anzahl unveränderter Zeilen liefert dem aufrufenden Code trotzdem einen nützlichen Nachweis, dass drei Zeilen untersucht wurden und bereits übereinstimmten.
Halte die vollständige Schleife innerhalb eines Verbindungskontexts. Wenn auf eine neue erste Zeile eine Abweichung folgt, verlässt das Auslösen des Fehlers den Kontext und rollt diese neue Zeile zurück. Wiederholungsversuche einzuordnen schwächt die Atomarität nicht. Gib (inserted, unchanged) erst zurück, nachdem jede vorbereitete Zeile erfolgreich eingeordnet wurde.
Die Zähler beschreiben diesen Aufruf, keine bereits in der Tabelle gespeicherten Gesamtzahlen. Eine leere vorbereitete Liste würde deshalb (0, 0) zurückgeben, obwohl der öffentliche CSV-Reader nie eine solche erzeugt.
Aufgabe
Bearbeite das vorhandene import_staged_items(connection, items) in catalog_import.py.
Implementiere genau die Entscheidungsmatrix nach Kennzeichen und ID. Zähle nur Übereinstimmungen aller fünf Felder als unverändert, füge nur ein neues Kennzeichen mit ungenutzter ID ein und löse den exakten ValueError für Abweichung oder fremdvergebene ID aus. Behalte eine Transaktion bei und rolle bei jedem Konflikt alle früheren neuen Zeilen zurück.