10.6.8 Класс cursor.MySQLCursorPrepared
Класс MySQLCursorPrepared наследуется от MySQLCursor.
Этот класс доступен начиная с Connector/Python 1.1.0. Расширение C поддерживает его начиная с Connector/Python 8.0.17.
В MySQL существуют два способа выполнения подготовленного запроса:
Использование и команд.
Использование двоичного протокола клиент/сервер для отправки и получения данных. Для повторного выполнения одного и того же запроса с разными данными для различных выполнений это более эффективно, чем использование и . Сведения о двоичном протоколе см. в разделе Интерфейс подготовленного запроса C API.
В Connector/Python есть два способа создания курсора, который позволяет выполнять подготовленные запросы с использованием двоичного протокола. В обоих случаях метод объекта соединения cursor() возвращает объект MySQLCursorPrepared:
-
Более простой синтаксис использует аргумент
prepared=Trueк методуcursor(). Этот синтаксис доступен начиная с Connector/Python 1.1.2.import mysql.connector cnx = mysql.connector.connect(database='employees') cursor = cnx.cursor(prepared=True)
-
В качестве альтернативы, создайте экземпляр класса
MySQLCursorPrepared, используя аргументcursor_classк методуcursor(). Этот синтаксис доступен начиная с Connector/Python 1.1.0.import mysql.connector from mysql.connector.cursor import MySQLCursorPrepared cnx = mysql.connector.connect(database='employees') cursor = cnx.cursor(cursor_class=MySQLCursorPrepared)
Курсор, созданный из класса MySQLCursorPrepared, работает следующим образом:
В первый раз, когда вы передаете запрос методу
execute()курсора, он подготавливает запрос. Для последующих вызововexecute()подготовка пропускается, если запрос тот же.Метод
execute()принимает необязательный второй аргумент, содержащий список значений данных, которые нужно связать с маркерами параметров в запросе. Если аргумент списка присутствует, то должен быть один элемент на каждый маркер параметра.
Пример:
cursor = cnx.cursor(prepared=True)
stmt = "SELECT fullname FROM employees WHERE id = %s" # (1)
cursor.execute(stmt, (5,)) # (2)
# ... fetch data ...
cursor.execute(stmt, (10,)) # (3)
# ... fetch data ...
%sв запросе является маркером параметра. Не заключайте маркеры параметров в кавычки.Для первого вызова метода
execute()курсор подготавливает запрос. Если данные предоставлены в том же вызове, он также выполняет запрос, и вы должны извлечь данные.Для последующих вызовов
execute(), которые передают тот же SQL-запрос, курсор пропускает этап подготовки.
Подготовленные запросы, выполняемые с помощью MySQLCursorPrepared, могут использовать стиль параметризации format (%s) или qmark (?). Это отличается от неподготовленных запросов, выполняемых с помощью MySQLCursor, которые могут использовать стиль параметризации format или pyformat.
Для одновременного использования нескольких подготовленных запросов создайте несколько курсоров из класса MySQLCursorPrepared.
Протокол MySQL клиент/сервер имеет возможность отправки параметров подготовленного запроса с помощью команды COM_STMT_SEND_LONG_DATA. Для использования этого из скриптов Connector/Python отправьте нужный параметр с использованием интерфейса IOBase. Пример:
from io import IOBase
...
cur = cnx.cursor(prepared=True)
cur.execute("SELECT (%s)", (io.BytesIO(bytes("A", "latin1")), ))
© 2025 Oracle
Licensed under the GPLv2 License.