Bouw een Python-interface rond de database · oefening
Configureer elke verbinding één keer
Voordat je met de catalogus aan de slag gaat, moeten twee instellingen kloppen:
foreign_keys: 1
selected row type: Row
Op dit moment onthoudt list_available_items de tweede instelling, terwijl elke andere query of opdracht er opnieuw aan zou moeten denken. Voor de controle op verwijzende sleutels geldt dezelfde regel per verbinding. Eén functie voor het openen kan beide instellingen in één keer garanderen.
Open catalog_db.py. Voeg de twee instellingen toe in de meegeleverde functie open_database(database_path), tussen sqlite3.connect(database_path) en return connection:
def open_database(database_path):
connection = sqlite3.connect(database_path)
connection.execute("PRAGMA foreign_keys = ON")
connection.row_factory = sqlite3.Row
return connection
Verwijder daarna deze regel uit list_available_items:
connection.row_factory = sqlite3.Row
Behoud de query, result, fetchall() en de tijdelijke terugkeerwaarde (result, rows). Het rijtype verandert niet: Run geeft nu een verbinding mee die open_database al heeft geconfigureerd. De verplaatsing is van belang omdat de queryfunctie zich zo op haar query kan richten, zonder ongemerkt de verbinding van een aanroeper te veranderen.
open_database heeft een beperkte taak. De functie opent het pad dat de aanroeper meegeeft, schakelt direct de controle op verwijzende sleutels in, kiest rijen met toegang op naam en geeft de open verbinding terug. Ze maakt geen tabellen aan, laadt geen voorbeeldgegevens en voert geen commit, rollback of sluiting uit. Die acties horen bij aanroepers die meer van de context weten.
De volgorde voorkomt ook twee verrassingen van SQLite. Een query die vóór de toewijzing aan de row factory wordt uitgevoerd, zou nog steeds tuples met waarden op vaste posities opleveren. En controle op verwijzende sleutels die pas na het begin van een transactie wordt ingeschakeld, heeft mogelijk geen effect op die transactie. Configureer eerst; gebruik de verbinding daarna.
Druk op Run. De bestaande lijstaanroep gebruikt nu open_database(database_path). Een tweede zichtbaar blok laat concreet zien wat die functie oplevert:
open_database(database_path)
foreign_keys: 1
selected row type: Row
selected item: IT-100 | Cordless drill
connection still open: yes
Submit opent met je functie twee verschillende tijdelijke paden. Het controleert beide instellingen voordat het databasewerk doet, maakt tabellen aan, controleert dat een ontbrekende verwijzing wordt geweigerd, leest een kolom op naam en gebruikt elke verbinding opnieuw. Het controleert ook dat list_available_items geen row factory meer toewijst. Geef de verbinding terug; de aanroeper sluit haar.
Opdracht
Maak open_database(database_path) af zodat elke nieuwe verbinding de controle op verwijzende sleutels inschakelt en sqlite3.Row gebruikt, en geef daarna die open verbinding terug.
Verwijder connection.row_factory = sqlite3.Row uit list_available_items; het instellen van de verbinding hoort nu alleen in open_database. Maak in geen van beide functies tabellen aan, voer geen commit uit en sluit de verbinding niet.