Выполняется ли работа с БД в `execute` или в `fetch`?

#python #mysql

#python #mysql

Вопрос:

Я действительно не понимаю, когда сервер БД (MySQL) будет «работать», когда я отправляю к нему запрос:

Рассмотрим этот код Python3:

 import mysql.connector as mc
connection = mc.connect (host = db_host, user = db_user, passwd = db_password, db = db_name)
cursor = connection.cursor()
cursor.execute("SELECT * FROM veryLongTable;")
result = cursor.fetchall()
cursor.close()
connection.close()
  

Все это занимает несколько секунд в execute строке и несколько минут в fetchall строке.

Что там все-таки происходит? Выполняет ли сервер БД запрос и передает ли мне «необработанный» результат в execute и ничего не делает в fetchall (и последнее — это просто «прочитать результат, который я получил с сервера»), или он сохраняет результат и передает его только при моем вызове fetchall ? Или запрос просто «подготовлен» в execute , и почти вся работа выполнена в fetchall ?

Комментарии:

1. execute выполняет запрос на сервере и возвращает итератор. fetchall возвращает строки.

2. Не могли бы вы немного подробнее, пожалуйста? Кто возвращает итератор и кто возвращает строки?

3. Сервер возвращает итератор и сохраняет его в курсоре с помощью execute . Затем сервер возвращает несколько строк с fetchall . Обе операции требуют подключения к серверу.

Ответ №1:

execute выполняет запрос на сервере и возвращает итератор. fetchall возвращает строки.

Сервер возвращает итератор и сохраняет его в курсоре с помощью execute . Затем сервер возвращает несколько строк с fetchall . Обе операции требуют подключения к серверу.

Почти вся работа выполняется в execute . Выполняется оператор, и данные подготавливаются на сервере для извлечения клиентом. С fetchall помощью курсора выполняется итерация по списку подготовленных строк и передача их клиенту по нескольку за раз.

«или он сохраняет результат и передает его только при вызове fetchall « Да, именно так это работает.