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)