Maak een schema, importeer gegevens en ontwikkel het verder · oefening
Leg de schemaversie vast
Twee databases kunnen verschillende generaties van dezelfde applicatietabellen bevatten. Alleen kijken naar een bestandsnaam zoals catalog.db vertelt je initialisatiecode niet welke generatie ze heeft geopend.
SQLite biedt hiervoor een klein geheel getal: PRAGMA user_version. Het staat in het databasebestand, begint bij 0 en kan door een applicatie worden beheerd. SQLite bepaalt de betekenis niet. In dit project betekent 2 de huidige structuur met drie tabellen, met members.email als laatste kolom.
Open catalog_setup.py. Breng twee gerichte wijzigingen aan.
Bewerk eerst je opgeslagen create_current_schema(connection). Voer na alle drie de geslaagde CREATE TABLE-aanroepen, maar vóór de bestaande commit, deze statische instructie uit:
connection.execute("PRAGMA user_version = 2")
Het is van belang dat het schrijven van de versie binnen dezelfde transactie blijft. Als het aanmaken van een tabel mislukt, moet de rollback zowel het schema als zijn versiemarkering ongewijzigd laten.
Maak daarna de nieuwe functie schema_version(connection) af. Voer de statische leesinstructie PRAGMA user_version uit, haal de ene rij op en geef het gehele getal uit die rij terug. Geef niet de Python-literal 2 terug. De functie moet de versie melden van elke database die ze ontvangt.
Druk op Run. Het zichtbare run_setup.py doet nu deze aanroepen:
create_current_schema(current_connection)
schema_version(current_connection)
schema_version(version_seven_connection)
De tweede verbinding is bewust gemarkeerd met 7, dus de belangrijke uitvoer is:
== record the version ==
Call: schema_version(current_connection)
Current schema version: 2
Call: schema_version(version_seven_connection)
Other stored version: 7
Je ziet het eerdere opbouwblok ook Schema version: 2 melden. Het uitvoerprogramma roept dezelfde opgeslagen initialisatiefunctie opnieuw aan en drukt af wat de database daadwerkelijk bevat. Het bewaart geen oud resultaat van een eerdere uitvoering.
Submit heropent een pas geïnitialiseerd bestand en geeft ook verbindingen mee die zijn gemarkeerd met 1, 2 en 7. Daarna dwingt het een late schemafout af. Die mislukte aanroep moet de versie nog steeds op 0 laten staan. Dat bewijst dat de markering een voltooid schema beschrijft, niet een poging daartoe.
De markering gaat mee met het databasebestand.
Opdracht
Leg in catalog_setup.py de versie vast met PRAGMA user_version = 2 binnen create_current_schema(connection), vóór de bestaande commit.
Maak daarna schema_version(connection) af zodat de functie PRAGMA user_version uitvoert, de ene rij ophaalt en het gehele getal uit die rij teruggeeft. Houd beide PRAGMA-instructies statisch en laat de verbinding open.
Druk op Run en zoek naar de huidige versie 2 en de afzonderlijk opgeslagen versie 7.