Maak een schema, importeer gegevens en ontwikkel het verder · oefening
Onderscheid een lege database van een onbekende
Een database die is gemarkeerd met versie 0 is niet automatisch leeg. Iemand kan een tabel hebben aangemaakt zonder een versie vast te leggen, en initialisatiecode mag die onbekende toestand niet overschrijven.
De lijst met applicatietabellen geeft de doorslag. SQLite bewaart schemarecords in sqlite_schema, dus maakt deze query de namen in een vaste volgorde zichtbaar:
SELECT name
FROM sqlite_schema
WHERE type = 'table'
ORDER BY name;
Open catalog_setup.py en maak user_table_names(connection) af. Voer precies die query uit, roep fetchall() aan en bouw een lijst met namen op. SQLite kan eigen tabellen aanmaken waarvan de naam begint met sqlite_; sluit die in Python uit met name.startswith("sqlite_"). Voeg geen LIKE toe aan de SQL.
Geef de overgebleven namen terug in de volgorde van de query. Het resultaat heeft een precieze betekenis voor latere beslissingen bij het voorbereiden:
[]samen met versie0betekent dat de database leeg is en veilig kan worden geïnitialiseerd.Elke naam van een gebruikerstabel samen met versie
0betekent dat de database onbekend is en moet worden geweigerd.
Dat tweede geval biedt bescherming. Een tabel met de naam notes kan bij een ander programma of een handmatig experiment horen. Als je de database leeg noemt omdat de markering 0 is, zou de initialisatiefunctie een bestand in gebruik nemen dat ze niet begrijpt.
Druk op Run. run_setup.py doet deze aanroepen:
user_table_names(blank_connection)
user_table_names(current_connection)
Het nieuwe blok moet dit tonen:
== distinguish blank from unknown ==
Call: user_table_names(blank_connection)
User tables: []
Call: user_table_names(current_connection)
User tables: ['items', 'loans', 'members']
De functie neemt alleen waar. Ze maakt niets aan, verwijdert niets, hernoemt niets en kent geen versie toe. Ook laat ze de verbinding open.
Submit geeft je ook een database met een applicatietabel en SQLite’s eigen tabel sqlite_sequence. De applicatietabel moet zichtbaar blijven, terwijl de interne naam buiten het resultaat blijft. Zo blijft “leeg” gekoppeld aan de toestand waarvoor je programma verantwoordelijk is.
Omdat deze controle alleen leest, kan een aanroeper een onbekend bestand inspecteren en beslissen wat te doen zonder eerst het bewijsmateriaal te veranderen.
Opdracht
Maak user_table_names(connection) in catalog_setup.py af.
Voer de getoonde query op sqlite_schema uit, haal elke rij op en geef de namen in volgorde terug. Laat in Python namen weg die beginnen met sqlite_. Gebruik geen LIKE en verander of sluit de database niet.
Druk op Run en controleer dat een lege verbinding [] teruggeeft en het huidige schema ['items', 'loans', 'members'].