Maak een schema, importeer gegevens en ontwikkel het verder · eindproject
Eindproject: Project: bereid een catalogus voor vanuit de bron
De onderdelen hebben nu duidelijke taken. catalog_setup.py bepaalt of een database het huidige schema mag krijgen. catalog_import.py leest en valideert een volledige CSV en past daarna één idempotente transactie toe. Het project voegt één functie toe die een pad ontvangt en deze onderdelen combineert zonder hun garanties te verzwakken.
Maak deze functie af:
import_items_csv(database_path, csv_path)
Zet database_path eerst om in een Path en weiger een ontbrekend pad met ValueError("Database does not exist. Run init first."). Alleen de expliciete voorbereidingsaanroep mag een nieuw bestand aanmaken. Voer vervolgens read_item_rows(csv_path) en validate_item_rows(rows) volledig uit. Deze volgorde is van belang: een ongeldige CSV mag een verder geldige database van versie 1 niet migreren.
Roep na de geslaagde voorbereiding van de gegevens prepare_database(database_path) aan. Open daarna één geconfigureerde applicatieverbinding met open_database(database_path), geef die samen met de voorbereide tuples door aan import_staged_items en geef de twee aantallen terug. Sluit die verbinding in finally, ongeacht of de import terugkeert of een fout opwerpt.
Run gebruikt een nieuw tijdelijk database_path. Het roept prepare_database(database_path) aan en daarna twee keer 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
De eerste getoonde aanroep is de afzonderlijke voorbereiding van de database. De overkoepelende functie weigert bewust om het aanmaken in een importopdracht te verbergen. Dat geeft een toekomstig opdrachtregelprogramma een expliciete actie init en maakt een typefout in het databasepad veilig.
Lees dit project als een reeks verantwoordelijkheden die worden doorgegeven. De CSV-lezer beheert zijn bestandsobject. prepare_database beheert zijn verbinding voor de voorbereiding. import_items_csv beheert zijn applicatieverbinding. De transactiefunctie laat een meegegeven verbinding open. Elke beheerder sluit alleen wat die zelf heeft geopend.
Houd de import beperkt tot dezelfde vijf velden. De nieuwe kolom members.email laat later zien dat de migratie een zichtbaar doel had, maar CSV-gegevens voor voorwerpen mogen nooit ledenrijen of e-mailadressen schrijven.
Run opent het bestand opnieuw voordat het het uiteindelijke aantal meldt. Die drie rijen zijn dus blijvend opgeslagen en niet alleen zichtbaar via één verbinding.
Opdracht
Maak import_items_csv(database_path, csv_path) in catalog_import.py af.
Weiger een ontbrekende database, lees en valideer de CSV volledig vóór de voorbereiding van de database, roep prepare_database aan, open één geconfigureerde verbinding, roep import_staged_items aan en sluit in finally. Geef de aantallen ingevoegde en ongewijzigde rijen terug zonder programmeerfouten op te vangen.