Maak een schema, importeer gegevens en ontwikkel het verder · oefening
Laat een exact herhaalde import niets wijzigen
Dezelfde vertrouwde import twee keer uitvoeren mag geen duplicaten maken of mislukken. Maar “dezelfde” moet meer betekenen dan dezelfde code vinden. Open je opgeslagen import_staged_items(connection, items) en verbeter de beslissing binnen de bestaande transactie.
Selecteer voor elke inkomende tuple eerst alle vijf de velden die de CSV beheert, op basis van de inventariscode. Er zijn drie uitkomsten:
Als elke geselecteerde waarde gelijk is aan de inkomende tuple, schrijf je niets en verhoog je
unchanged.Als de code bestaat maar een van de beheerde velden afwijkt, werp je
ValueError("CSV item TAG disagrees with the stored item.")op.Als de code nieuw is, controleer je het inkomende ID. Wanneer een andere code dat ID al gebruikt, werp je
ValueError("CSV item TAG uses an ID that belongs to another item.")op; anders voeg je de rij in.
Houd beide selects en de insert geparametriseerd. Werk geen bestaande rij bij en verwijder er geen. Een CSV beheert precies deze vijf velden, dus gebruikt een exacte vergelijking alle vijf in hun vastgelegde volgorde.
Run herhaalt precies de aanroepen die je net zag. Alleen de waargenomen beslissingen veranderen:
== 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
Deze eigenschap heet idempotentie: zodra een exacte batch is geïmporteerd, leidt herhaling tot dezelfde opgeslagen toestand. Het aantal ongewijzigde rijen geeft de aanroeper nog steeds nuttige informatie: er zijn drie rijen bekeken die al overeenkwamen.
Houd de volledige lus binnen één verbindingscontext. Als op een nieuwe eerste rij een afwijking volgt, verlaat de opgeworpen fout de context en wordt die nieuwe rij teruggedraaid. Herhalingen herkennen verzwakt de atomiciteit niet. Geef (inserted, unchanged) pas terug nadat elke voorbereide rij met succes is beoordeeld.
De tellers beschrijven deze aanroep, niet de totalen die al in de tabel staan. Een lege voorbereide lijst zou daarom (0, 0) teruggeven, hoewel de publieke CSV-lezer die nooit oplevert.
Opdracht
Bewerk de bestaande import_staged_items(connection, items) in catalog_import.py.
Implementeer de exacte beslismatrix op basis van code en ID. Tel alleen overeenkomsten in alle vijf de velden als ongewijzigd, voeg alleen een nieuwe code met een ongebruikt ID in en werp de exacte ValueError op voor een afwijking of een ID dat bij een ander voorwerp hoort. Houd één transactie aan en draai bij elk conflict alle eerdere nieuwe rijen terug.