该类MySQLCursorPrepared
继承自
MySQLCursor
.
此类自 Connector/Python 1.1.0 起可用。从 Connector/Python 8.0.17 开始,C 扩展支持它。
在 MySQL 中,有两种方法可以执行准备好的语句:
使用二进制客户端/服务器协议发送和接收数据。对于不同的执行,用不同的数据重复执行同一条语句,这比使用
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 ...
%s
语句中的是参数标记 。不要在参数标记两边加上引号。对于
execute()
方法的第一次调用,游标准备语句。如果数据在同一个调用中给出,它也会执行语句,您应该获取数据。对于传递相同 SQL 语句的后续
execute()
调用,游标将跳过准备阶段。
执行的准备好的语句
MySQLCursorPrepared
可以使用
format
( %s
) 或
qmark
( ?
) 参数化样式。这不同于使用 执行的非准备语句
MySQLCursor
,后者可以使用
format
orpyformat
参数化样式。
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")), ))