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()方法的cursor_class引數來建立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()叫用,如果語句相同,則會跳過準備階段。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 或 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")), ))