文档首页
MySQL Connector/Python 开发人员指南
相关文档 下载此手册
PDF (US Ltr) - 0.7Mb
PDF (A4) - 0.7Mb


10.6.8 cursor.MySQLCursorPrepared 类

The MySQLCursorPrepared 类继承自 MySQLCursor.

注意

此类从 Connector/Python 1.1.0 开始可用。C 扩展从 Connector/Python 8.0.17 开始支持它。

在 MySQL 中,有两种方法可以执行预处理语句

  • 使用 PREPAREEXECUTE 语句。

  • 使用二进制客户端/服务器协议发送和接收数据。要重复执行相同的语句,但使用不同的数据进行不同的执行,这种方法比使用 PREPAREEXECUTE 更有效。有关二进制协议的信息,请参见 C API 预处理语句接口.

在 Connector/Python 中,有两种方法可以创建一个游标,使之能够使用二进制协议执行预处理语句。在这两种情况下,连接对象的 cursor() 方法都返回一个 MySQLCursorPrepared 对象

  • 更简单的语法是在 cursor() 方法中使用 prepared=True 参数。此语法从 Connector/Python 1.1.2 开始可用。

    import mysql.connector
    
    cnx = mysql.connector.connect(database='employees')
    cursor = cnx.cursor(prepared=True)
  • 或者,使用 cursor_class 参数在 cursor() 方法中创建一个 MySQLCursorPrepared 类的实例。此语法从 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() 调用,如果语句相同,则会跳过准备阶段。

  • The 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 执行的非预处理语句不同,后者可以使用 formatpyformat 参数化风格。

要同时使用多个预处理语句,请从 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")), ))