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)