Maak een schema, importeer gegevens en ontwikkel het verder · oefening
Weiger een versie die niet bij de structuur past
Een versienummer is slechts één aanwijzing. Een bestand kan versie 1 aangeven terwijl het members.email al bevat, of versie 2 aangeven terwijl er een tabel ontbreekt. Een migratie uitvoeren op een van die bestanden kan de schade vergroten.
Maak prepare_database(database_path) in catalog_setup.py af. De aanroeper geeft het exacte pad mee. Je functie opent dat pad, leest PRAGMA user_version, leest de namen van gebruikerstabellen en leest de kolommen in hun volgorde met de drie vaste PRAGMA table_info(...)-instructies in de startcode.
Bepaal de volledige actie voordat je iets verandert:
Versie 0 zonder gebruikerstabellen is leeg, dus maak versie 2 aan.
Versie 0 met een gebruikerstabel is onbekend. Werp
ValueError("Database has tables but no schema version.")op.De exacte structuur van versie 1 wordt één keer gemigreerd.
De exacte structuur van versie 2 is al gereed en blijft onaangeroerd.
Elke andere markering veroorzaakt
ValueError("Schema version N is not supported.").Versie 1 of 2 met afwijkende tabellen of een afwijkende kolomvolgorde veroorzaakt
ValueError("Schema version N does not match the expected tables and columns.").
Hier staat dezelfde beslissing samengevat in vier veilige routes. In elke route worden de versie en de werkelijke structuur samen gecontroleerd. CHECK VERSION + SHAPE betekent “controleer versie en structuur”. Bij version 0 + blank is de database leeg en betekent CREATE VERSION 2 “maak versie 2 aan”. Bij version 1 + expected shape, versie 1 met de verwachte structuur, betekent MIGRATE TO VERSION 2 “migreer naar versie 2”. Bij version 2 + expected shape betekent USE UNCHANGED “gebruik ongewijzigd”. Unsupported or mismatched betekent “niet ondersteund of niet overeenkomend”; REFUSE NO CHANGE betekent dan “weiger zonder wijzigingen”:

Run gebruikt vier tijdelijke paden en roept dezelfde functie aan als prepare_database(missing_path), prepare_database(version_one_path), prepare_database(version_two_path) en prepare_database(mismatched_path):
== guard schema compatibility ==
missing database -> version 2
exact version 1 -> version 2; M-17 email NULL
exact version 2 -> unchanged; M-18 email alex@example.com
mismatched version 1 -> Error: Schema version 1 does not match the expected tables and columns.
Een extra tabel telt ook als afwijking. De kolomvolgorde is van belang, omdat een andere volgorde kan wijzen op een ander schema, zelfs wanneer de namen dezelfde set vormen.
Sluit elke verbinding die deze functie met een pad als argument opent, ook bij weigering. Bouw een huidige database niet opnieuw op en migreer pas nadat de structuur van versie 1 de volledige controle heeft doorstaan. Weigering hoort voorspelbaar te zijn: de markering, kolommen en rijen blijven precies zoals ze waren.
Die voorspelbare weigering geeft de aanroeper een gerichte keuze voor herstel in plaats van een gedeeltelijk gewijzigd bestand.
Opdracht
Maak prepare_database(database_path) in catalog_setup.py af.
Implementeer precies de hierboven beschreven beslissingen voor een lege database, tabellen zonder versie, versie 1, versie 2, een niet-ondersteunde versie en een afwijking tussen markering en structuur. Inspecteer alle drie de tabellen en hun kolommen in volgorde voordat je migreert. Sluit de verbinding in finally en verander nooit een geweigerde database.