Обработка данных блоками
Отличная работа! Как Джейсон объяснил в видео, иногда приходится работать с большим ResultProxy, и загрузить все результаты сразу может не хватить памяти. Чтобы обойти эту проблему, можно получать данные из ResultProxy блоками с помощью метода .fetchmany() внутри цикла. Методу .fetchmany() передаётся аргумент — количество записей, которые нужно извлечь за один раз. Когда метод возвращает пустой список, это означает, что строк больше нет и все результаты запроса обработаны. После этого необходимо вызвать метод .close(), чтобы закрыть соединение с базой данных.
Теперь у вас есть возможность попрактиковаться на большом объекте ResultProxy с именем results_proxy, который уже загружен для вас.
Это упражнение является частью курса
Введение в базы данных на Python
Инструкции к упражнению
- Используйте цикл
while, который проверяет значение флагаmore_results. - Внутри цикла вызовите метод
.fetchmany()на объектеresults_proxy, чтобы каждый раз извлекать по50записей, и сохраняйте их в переменнуюpartial_results. - После извлечения записей проверьте: если
partial_results— пустой список (то есть равен[]), установитеmore_resultsв значениеFalse. - Переберите элементы
partial_resultsв цикле и: еслиrow.stateуже есть в словареstate_count, увеличьтеstate_count[row.state]на 1; в противном случае установитеstate_count[row.state]равным 1. - После цикла
whileзакройте объект ResultProxyresults_proxyс помощью метода.close(). - Нажмите Отправить ответ, чтобы вывести
state_count.
Интерактивное практическое упражнение
Попробуйте выполнить это упражнение, дополнив этот пример кода.
# 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)