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")), ))