#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
« Да, именно так это работает.