Verbind tabellen in plaats van gegevens te herhalen · oefening
Schakel de controle op verwijzende sleutels in
Het schema zegt nu waar elk ID in een uitlening naartoe moet leiden. Een standaardverbinding meldde nog steeds foreign_keys: 0, dus SQLite dwong die beloften niet af. De instelling hoort bij de verbinding, niet bij het schemabestand.
Open connections.py. De functie open_database(database_path) opent het ontvangen pad al en geeft de bruikbare verbinding terug. Voeg deze regel toe tussen die twee handelingen:
connection.execute("PRAGMA foreign_keys = ON")
PRAGMA is de SQLite-instructie om een database-instelling te lezen of te wijzigen. Deze schakelt de controle op verwijzende sleutels voor die verbinding in. Houd de instructie vast. Ze bevat geen waarde die de cursist kan bepalen en die gebonden moet worden.
Druk op Run. run_relationships.py maakt een tijdelijke database, roept je functie twee keer aan met hetzelfde getoonde database_path en vraagt elke teruggegeven verbinding naar de instelling. Daarna probeert het een uitlening waarvan het voorwerp-ID niet bestaat.
Dit zijn de belangrijke regels:
first foreign_keys: 1
missing item: IntegrityError
second foreign_keys: 1
first still open: yes
second still open: yes
De twee waarden 1 zijn elk afzonderlijk van belang. De controle inschakelen voor first schakelt die niet in voor second, ook al openen beide verbindingen hetzelfde databasebestand. Elke aanroep van open_database moet de nieuwe verbinding die hij maakt instellen.
Je functie laat beide verbindingen ook open. Door een verbinding te openen, draag je het beheer van haar levensduur over aan de aanroeper. Die kan query’s uitvoeren en de verbinding later sluiten. Een gesloten verbinding teruggeven, of één globale verbinding bewaren en herhaaldelijk teruggeven, zou die belofte breken.
Submit roept open_database aan met verschillende paden en gegevens. Het controleert ontbrekende voorwerpen en leden afzonderlijk, slaat een geldige uitlening op en voert daarna een onschuldige query uit. Zodra dat slaagt, werken de schemadefinitie en verbindingsinstelling samen: de tabel beschrijft de relaties en elke verbinding die je functie opent dwingt ze af.
Opdracht
Maak open_database(database_path) in connections.py af. Schakel de controle op verwijzende sleutels van SQLite in op de nieuwe verbinding voordat je die teruggeeft.
Druk op Run en controleer of twee afzonderlijke aanroepen allebei foreign_keys: 1 melden, een ontbrekend voorwerp een IntegrityError veroorzaakt en beide teruggegeven verbindingen bruikbaar blijven.