10.6.8 cursor.MySQLCursorPrepared类

该类MySQLCursorPrepared继承自 MySQLCursor.

笔记

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

在 MySQL 中,有两种方法可以执行准备好的语句:

  • 使用PREPAREEXECUTE语句。

  • 使用二进制客户端/服务器协议发送和接收数据。对于不同的执行,用不同的数据重复执行同一条语句,这比使用PREPARE and更高效EXECUTE。有关二进制协议的信息,请参阅 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. 对于传递相同 SQL 语句的后续execute()调用,游标将跳过准备阶段。

执行的准备好的语句 MySQLCursorPrepared可以使用 format( %s) 或 qmark( ?) 参数化样式。这不同于使用 执行的非准备语句 MySQLCursor,后者可以使用 formatorpyformat 参数化样式。

MySQLCursorPrepared 要同时使用多个准备好的语句,请从类 中实例化多个游标。

MySQL 客户端/服务器协议有一个选项可以通过 COM_STMT_SEND_LONG_DATA命令发送准备好的语句参数。要从连接器/Python 脚本中使用它,请使用 IOBase接口发送有问题的参数。例子:

from io import IOBase

...

cur = cnx.cursor(prepared=True)
cur.execute("SELECT (%s)", (io.BytesIO(bytes("A", "latin1")), ))