The MySQLCursorPrepared
类继承自 MySQLCursor
.
此类从 Connector/Python 1.1.0 开始可用。C 扩展从 Connector/Python 8.0.17 开始支持它。
在 MySQL 中,有两种方法可以执行预处理语句
使用二进制客户端/服务器协议发送和接收数据。要重复执行相同的语句,但使用不同的数据进行不同的执行,这种方法比使用
PREPARE
和EXECUTE
更有效。有关二进制协议的信息,请参见 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 ...
语句中的
%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")), ))