Spec-Zone.ru › MySQL Connectors 1.0

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 ...
  1. %s в запросе является маркером параметра. Не заключайте маркеры параметров в кавычки.

  2. Для первого вызова метода execute() курсор подготавливает запрос. Если данные предоставлены в том же вызове, он также выполняет запрос, и вы должны извлечь данные.

  3. Для последующих вызовов 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.
https://docs.oracle.com/cd/E17952_01/connector-python-en/connector-python-api-mysqlcursorprepared.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API