使用 MySQL Connector/Python 呼叫會回傳結果集(如 SELECT)的預存程序時,需透過游標的 stored_results() 方法迭代取得每個結果集的游標,再逐列讀取資料。
import mysql.connector
# 建立連線
cnx = mysql.connector.connect(
user='scott',
password='tiger',
database='mining'
)
cur = cnx.cursor()
# 建立示範用預存程序(查詢 Slave 狀態)
cur.execute("DROP PROCEDURE IF EXISTS slave_status")
proc_sql = """
CREATE PROCEDURE slave_status ()
BEGIN
SHOW SLAVE STATUS;
END
"""
cur.execute(proc_sql)
# 呼叫預存程序
cur.callproc('slave_status')
# 關鍵:透過 stored_results() 取得所有結果集的游標迭代器
for result_cursor in cur.stored_results():
for row in result_cursor:
print(row[0]) # 印出第一欄(如 Slave_IO_State)
# 關閉資源
cur.close()
cnx.close()
shell$ python foo.py Waiting for master to send event
MySQLCursorBuffered 物件。SELECT 會有,INSERT 則無),避免對無結果集的游標迭代。SELECT,迴圈會依序處理每一個。for result_cursor in cur.stored_results():
if result_cursor.with_rows:
rows = result_cursor.fetchall()
for row in rows:
print(row)
else:
print("此結果集無資料列(如 DDL/DML)")
此模式適用於所有回傳結果集的預存程序呼叫,是 Connector/Python 官方建議的標準作法。