Python實現(xiàn)調(diào)用MySQL數(shù)據(jù)庫的存儲過程
一、準備工作
首先需要安裝 Python 操作 MySQL 的庫,最常用的是 mysql-connector-python(官方庫)或 pymysql,這里以官方庫為例:
pip install mysql-connector-python
二、完整實現(xiàn)步驟
1. 先在 MySQL 中創(chuàng)建測試存儲過程
首先我們需要一個可測試的存儲過程,比如創(chuàng)建一個根據(jù)用戶 ID 查詢用戶信息的存儲過程:
-- 先創(chuàng)建測試表(可選)
CREATE TABLE IF NOT EXISTS users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT,
email VARCHAR(100)
);
-- 插入測試數(shù)據(jù)
INSERT INTO users (name, age, email) VALUES
('張三', 25, 'zhangsan@test.com'),
('李四', 30, 'lisi@test.com');
-- 創(chuàng)建存儲過程:根據(jù)ID查詢用戶信息
DELIMITER // -- 臨時修改語句結(jié)束符為//,避免與存儲過程內(nèi)的;沖突
CREATE PROCEDURE get_user_by_id(IN user_id INT, OUT user_name VARCHAR(50), OUT user_age INT)
BEGIN
SELECT name, age INTO user_name, user_age FROM users WHERE id = user_id;
END //
DELIMITER ; -- 恢復語句結(jié)束符為;
-- 另一個測試存儲過程:無參數(shù),查詢所有用戶
CREATE PROCEDURE get_all_users()
BEGIN
SELECT * FROM users;
END;
2. Python 調(diào)用存儲過程的代碼實現(xiàn)
下面是 Python 調(diào)用存儲過程的完整代碼,包含兩種常見場景:帶輸入/輸出參數(shù)的存儲過程、無參數(shù)的存儲過程:
import mysql.connector
from mysql.connector import Error
def call_mysql_procedure():
# 數(shù)據(jù)庫連接配置
config = {
'host': 'localhost', # 數(shù)據(jù)庫地址
'user': 'root', # 用戶名
'password': '你的數(shù)據(jù)庫密碼', # 密碼
'database': 'test_db' # 數(shù)據(jù)庫名(替換為你的庫名)
}
connection = None
try:
# 1. 建立數(shù)據(jù)庫連接
connection = mysql.connector.connect(**config)
if connection.is_connected():
cursor = connection.cursor()
# ========== 場景1:調(diào)用帶輸入/輸出參數(shù)的存儲過程 ==========
# 定義輸入?yún)?shù)和輸出參數(shù)
user_id = 1 # 輸入?yún)?shù)
user_name = None # 輸出參數(shù)(初始化為None)
user_age = None # 輸出參數(shù)(初始化為None)
# 調(diào)用存儲過程:callproc(存儲過程名, (參數(shù)列表))
cursor.callproc('get_user_by_id', (user_id, user_name, user_age))
# 獲取輸出參數(shù)(存儲過程執(zhí)行后,參數(shù)會被更新,存在cursor.stored_results()中)
for result in cursor.stored_results():
# 或者直接通過 cursor.outputs 獲取(不同版本可能略有差異)
output_params = result.fetchone()
if output_params:
user_name, user_age = output_params
print(f"場景1 - 查詢ID為{user_id}的用戶:")
print(f"姓名:{user_name},年齡:{user_age}\n")
# ========== 場景2:調(diào)用無參數(shù)的存儲過程(返回結(jié)果集) ==========
print("場景2 - 查詢所有用戶:")
cursor.callproc('get_all_users') # 無參數(shù),傳入空元組或省略
# 遍歷結(jié)果集
for result in cursor.stored_results():
users = result.fetchall() # 獲取所有結(jié)果
# 打印表頭
columns = [desc[0] for desc in result.description]
print("\t".join(columns))
# 打印數(shù)據(jù)
for user in users:
print("\t".join(str(col) for col in user))
# 提交事務(如果存儲過程有修改操作,必須提交)
connection.commit()
except Error as e:
print(f"數(shù)據(jù)庫操作出錯:{e}")
# 出錯時回滾事務
if connection:
connection.rollback()
finally:
# 關(guān)閉游標和連接
if connection and connection.is_connected():
if cursor:
cursor.close()
connection.close()
print("\n數(shù)據(jù)庫連接已關(guān)閉")
if __name__ == "__main__":
call_mysql_procedure()
三、關(guān)鍵代碼解釋
1.連接數(shù)據(jù)庫:通過 mysql.connector.connect() 傳入配置參數(shù)建立連接,注意替換為你的數(shù)據(jù)庫地址、用戶名、密碼和庫名。
2.調(diào)用存儲過程核心方法:cursor.callproc(proc_name, params)
proc_name:存儲過程名稱(字符串)。params:參數(shù)列表(元組),順序需與存儲過程的參數(shù)(IN/OUT/INOUT)一一對應。
3.獲取輸出參數(shù)/結(jié)果集:
- 帶輸出參數(shù)的存儲過程:執(zhí)行
callproc后,通過cursor.stored_results()遍歷結(jié)果,獲取輸出參數(shù)的值。 - 返回結(jié)果集的存儲過程:同樣通過
cursor.stored_results()獲取結(jié)果集,再用fetchone()/fetchall()讀取數(shù)據(jù)。
4.事務處理:如果存儲過程包含插入/更新/刪除操作,必須調(diào)用 connection.commit() 提交事務;出錯時用 connection.rollback() 回滾。
5.資源釋放:最后必須關(guān)閉游標和連接,避免資源泄漏。
到此這篇關(guān)于Python實現(xiàn)調(diào)用MySQL數(shù)據(jù)庫的存儲過程的文章就介紹到這了,更多相關(guān)Python調(diào)用MySQL存儲過程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python+selenium實現(xiàn)簡歷自動刷新的示例代碼
這篇文章主要介紹了python+selenium實現(xiàn)簡歷自動刷新的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-05-05
Python使用Scrapy抓取和解析網(wǎng)頁數(shù)據(jù)的方法
很多 Python 初學者學完基礎(chǔ)語法后,都會遇到一個很實際的問題:怎么把網(wǎng)頁里的數(shù)據(jù)穩(wěn)定地提取下來,變成自己能處理的結(jié)構(gòu)化數(shù)據(jù),Scrapy 是 Python 生態(tài)里非常經(jīng)典的爬蟲框架,本文給大家介紹了Python使用Scrapy抓取和解析網(wǎng)頁數(shù)據(jù)的方法,需要的朋友可以參考下2026-05-05
解決python3中自定義wsgi函數(shù),make_server函數(shù)報錯的問題
下面小編就為大家分享一篇解決python3中自定義wsgi函數(shù),make_server函數(shù)報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-11-11
python+html實現(xiàn)免費在線行為驗證保護賬號安全
這篇文章主要為大家介紹了python+html免費在線行為驗證保護賬號安全實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09
Python統(tǒng)計可散列的對象之容器Counter詳解
Counter是一個容器,可以跟蹤等效值增加的次數(shù).這個類可以用來實現(xiàn)其他語言中常用包或多集合數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的算法.本篇文章非常詳細的介紹了容器Counter的使用方式,需要的朋友可以參考下2021-05-05
Python 搭建Web站點之Web服務器網(wǎng)關(guān)接口
本文是Python 搭建Web站點系列文章的第二篇,接上文,主要給大家來講述Web服務器網(wǎng)關(guān)接口WSGI的相關(guān)資料,非常詳細,有需要的小伙伴可以參考下2016-11-11
python實現(xiàn)將html表格轉(zhuǎn)換成CSV文件的方法
這篇文章主要介紹了python實現(xiàn)將html表格轉(zhuǎn)換成CSV文件的方法,涉及Python操作csv文件的相關(guān)技巧,需要的朋友可以參考下2015-06-06
Python3利用Dlib19.7實現(xiàn)攝像頭人臉識別的方法
這篇文章主要介紹了Python 3 利用 Dlib 19.7 實現(xiàn)攝像頭人臉識別 ,利用python開發(fā),借助Dlib庫捕獲攝像頭中的人臉,提取人臉特征,通過計算歐氏距離來和預存的人臉特征進行對比,達到人臉識別的目的,感興趣的小伙伴們可以參考一下2018-05-05

