文件首頁
MySQL Connector/Python 開發人員指南
相關文件 下載本手冊
PDF (美式信紙) - 0.7Mb
PDF (A4) - 0.7Mb


10.6.8 cursor.MySQLCursorPrepared 類別

MySQLCursorPrepared 類別繼承自 MySQLCursor

注意

此類別自 Connector/Python 1.1.0 起可用。C 擴充自 Connector/Python 8.0.17 起支援此類別。

在 MySQL 中,有兩種方法可以執行預備語句

  • 使用 PREPAREEXECUTE 語句。

  • 使用二進位用戶端/伺服器協定來傳送和接收資料。對於使用不同資料重複執行相同語句的不同執行,這比使用 PREPAREEXECUTE 更有效率。有關二進位協定的資訊,請參閱 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 ...
  1. 語句中的 %s 是參數標記。請勿在參數標記周圍加上引號。

  2. 對於第一次呼叫 execute() 方法,游標會準備語句。如果在同一次呼叫中提供資料,它也會執行語句,您應該擷取資料。

  3. 對於後續傳遞相同 SQL 語句的 execute() 呼叫,游標會跳過準備階段。

使用 MySQLCursorPrepared 執行的預備語句可以使用 format (%s) 或 qmark (?) 參數化樣式。這與使用 MySQLCursor 執行的非預備語句不同,後者可以使用 formatpyformat 參數化樣式。

若要同時使用多個預備語句,請從 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")), ))