Python調用mysql存儲過程


python調用mysql存儲過程時,會根據是否有出參而返回不同的結果,另外mysql的存儲過程是可以返回多個結果集(select ...) .但在本文的項目中不允許這樣使用,有興趣的可以自行研究一下如何接收多個返回值。

 

首先我們創建三個存儲過程來用於測試

-- 有一個出參的
CREATE PROCEDURE PR_SUB(x int,y int,out total  int)
begin
    set total:=x+y;
END

--有兩個出參的:
CREATE PROCEDURE PR_SUB2(x int,y int, out m int ,out n int)
begin
    set m=x+y;
    set n=x-y;
END

--沒有出參的
CREATE PROCEDURE PR_TEST(x int,y int)
begin
    declare v int;
        set v=x+y;
END

python在調用完成后,需要使用execute來查詢獲取各個參數的值(包括入參和出參). 名稱是這樣的:@_存儲過程名稱_參數位置(從1開始)

比如PR_SUB有兩個入參:x int,y int,一個出參: out n int.

可以在execute中使用select @_PR_SUB_1,@_PR_SUB_2,@_PR_SUB_3 來分區獲取參數x,y,n的值。

Python代碼:

class MySqlClient(object):

def __init__(self)
self.host='xxx'
self.user='xxx'
self.pwd='xxx'
self.port=3306
self.database='xxx'

def callproc(self, proc_name: "str", in_params: list = None, out_params: list = None) -> list
with pymysql.connect(host=self.host, user=self.user, password=self.pwd, port=self.port, database=self.database, charset='utf8') as conn: cursor = conn.cursor() in_par_length = len(in_params) if out_params and len(out_params) > 0: args = in_params + out_params cursor.callproc(proc_name, args=args) # 調用存儲過程,入參和出參都要輸入 out_parm_string = "select " for x in range(len(out_params)): # 根據入參和出參的個數,來推斷出要獲取的參數的序號。這里只獲取了出參 out_parm_string = "{pre} @_{p}_{i},".format(pre=out_parm_string, p=proc_name, i=in_par_length) in_par_length += 1 cursor.execute(out_parm_string[:-1]) # 獲取參數的值 return list(cursor.fetchall()[0]) else: return []

調用方式:

        mysql=MysqlClienct()
res = mysql.callproc("PR_TEST", in_params=[11, 22], out_params=[])
print(aa)
aa = mysql.callproc("pr_sub", [1, 2], [None, ]) print(aa) aa = mysql.callproc("pr_sub2", [1, 2], [None, None, ]) print(aa)

 結果分別為:

(),

(3)

(3,-1)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM