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)

 

posted @ 2022-01-25 13:44  踏叶乘风  阅读(2089)  评论(0编辑  收藏  举报