Hoofdstuk 9 · oefening
Maak een schema, importeer gegevens en ontwikkel het verder
Bouw het schema opnieuw op vanuit de bron
Een leeg databasepad is nog geen uitleendatabase. Het heeft elke keer dezelfde drie tabellen en regels nodig, ook wanneer er geen eerder .db-bestand beschikbaar is om te kopiëren.
In dit project zijn vier bestanden zichtbaar:
| Bestand | Rol |
|---|---|
catalog_setup.py | Het bestand dat je bewerkt om het schema aan te maken en later bij te werken. |
catalog_db.py | De voltooide query- en opdrachtfuncties die je al hebt gebouwd. Laat dit bestand ongewijzigd. |
data/items.csv | De voorwerprecords die je later importeert. |
run_setup.py | Het zichtbare programma dat Run uitvoert om je functies met tijdelijke databases aan te roepen. |
Open catalog_setup.py. De drie CREATE TABLE-strings bevatten het huidige ontwerp al. Versie 2 behoudt de bekende tabellen items en loans en voegt email TEXT, dat NULL toestaat, toe als laatste kolom van members.
Je werkt in create_current_schema(connection). De functie ontvangt een open verbinding. Voer eerst BEGIN uit en daarna elk van de drie tabelinstructies afzonderlijk. Als alle instructies slagen, roep je connection.commit() aan. Als een instructie een exception veroorzaakt, roep je connection.rollback() aan en laat je die oorspronkelijke exception doorgaan.
Waarom schrijf je zelf BEGIN? Een SQLite-verbindingscontext kan commit of rollback kiezen voor gegevenswijzigingen, maar begint deze reeks instructies voor het aanmaken van tabellen niet voor je. Zonder expliciet begin kan bij een latere fout een eerdere tabel achterblijven. Hier hebben alle drie de tabellen één uitkomst nodig.
Sluit de verbinding niet. De aanroeper heeft haar meegegeven en beheert nog steeds haar levenscyclus.
Druk op Run. run_setup.py opent een nieuwe verbinding naar een database in het geheugen en doet precies deze aanroep:
create_current_schema(connection)
Het nieuwe blok moet zo eindigen:
== rebuild the schema ==
Call: create_current_schema(connection)
Tables: items, loans, members
Members columns: id, member_code, name, loan_limit, email
Schema version: 0
Transaction still open: no
De versie blijft bewust 0. Je hebt het aanmaken atomair gemaakt; nu heeft dat exacte schema een opgeslagen versie nodig.
Submit veroorzaakt ook bewust een later conflict. Als members al bestaat, mislukt de tweede aanmaak. Een correcte rollback verwijdert de tabel items die eerder in dezelfde poging is aangemaakt en behoudt de tabel die er al was.
Opdracht
Maak create_current_schema(connection) in catalog_setup.py af.
Voer een statisch BEGIN uit en daarna de meegeleverde instructies ITEMS_SQL, MEMBERS_SQL en LOANS_SQL. Commit één keer nadat alle drie zijn geslaagd. Draai bij een exception de transactie terug en laat dezelfde exception doorgaan. Laat de meegegeven verbinding open.
Druk op Run en controleer dat alle drie de tabellen verschijnen, email de laatste ledenkolom is, de versie nog steeds 0 is en er geen transactie open blijft.