Werken met blokken records
Fantastisch werk tot nu toe! Zoals Jason in de video besprak, kan het soms nodig zijn om met een grote ResultProxy te werken, terwijl je
mogelijk niet genoeg geheugen hebt om alle resultaten in één keer te laden. Om dat te omzeilen kun je
blokken met rijen ophalen uit de ResultProxy met de methode .fetchmany() binnen een loop. Met
.fetchmany() geef je als argument het aantal records dat je wilt. Zodra je
een lege lijst krijgt, zijn er geen rijen meer op te halen en heb je alle resultaten
van de query verwerkt. Daarna moet je de methode .close() gebruiken om de verbinding met de database te sluiten.
Je kunt dit nu oefenen op een grote ResultProxy genaamd results_proxy die alvast voor je is klaargezet.
Deze oefening maakt deel uit van de cursus
Introductie tot databases in Python
Oefeninstructies
- Gebruik een
while-loop die controleert of ermore_resultszijn. - Pas binnen de loop de methode
.fetchmany()toe opresults_proxyom telkens50records op te halen en sla die records op alspartial_results. - Stel na het ophalen, als
partial_resultseen lege lijst is (dus gelijk aan[]),more_resultsin opFalse. - Loop over de
partial_resultsen verhoog, alsrow.stateeen sleutel is in de dictionarystate_count,state_count[row.state]met 1; stel andersstate_count[row.state]in op 1. - Sluit na de while-loop de ResultProxy
results_proxymet.close(). - Verzend het antwoord om
state_countaf te drukken.
Praktische interactieve oefening
Probeer deze oefening eens door deze voorbeeldcode in te vullen.
# Start a while loop checking for more results
while more_results:
# Fetch the first 50 results from the ResultProxy: partial_results
partial_results = ____
# if empty list, set more_results to False
if partial_results == []:
more_results = ____
# Loop over the fetched records and increment the count for the state
for row in ____:
if row.state in state_count:
____
else:
____
# Close the ResultProxy, and thus the connection
results_proxy.____
# Print the count by state
print(state_count)