Python pymysql调用存储过程

使用pymysql调用存储过程

注意:存储过程需要在DECLARE定义变量之后添加set @@autocommit=1;,这是因为pymysql默认autocommit=0。

import pymysql
db = pymysql.connect(host='rm-******.mysql.rds.aliyuncs.com', port=3306, user='root',
                                 password='******', db='***')
cursor = db.cursor(pymysql.cursors.DictCursor)
cursor.callproc("proc_name", *args) # 参数为存储过程名称和存储过程接收的参数
db.commit()
# 获取数据
data = cursor.fetchall()
# 关闭数据库连接
db.close()

获取调用存储过程后的返回值

import pymysql
db = pymysql.connect(host='rm-******.mysql.rds.aliyuncs.com', port=3306, user='root',
                                 password='******', db='***')
cursor = db.cursor(pymysql.cursors.DictCursor)
cursor.callproc("proc_name", "param_0","param_1","param_2") # 参数为存储过程名称和存储过程接收的参数
db.commit()
# 获取数据
data = cursor.fetchall()
cursor.execute("select @_proc_name_0,@_proc_name_1,@_proc_name_2")# 查询调用存储过程后返回的参数
param_value = cursor.fetchone()
# 关闭数据库连接
db.close()

说明: 使用callproc调用存储过程时,要注意存储过程参数的类型和顺序要和数据库中存储过程的一致。获取返回值需要重新使用select语句查询。查询的返回值要根据传入位置确定,例如查询param_2这个参数经过存储过程处理后的返回值,要使用"select @_proc_name_2 "语句。查询字段规则是 @_+存储过程名称+_返回值在传入时的位置(从0计算)。因为param_2传入时是第3个参数,从0开始计算就是2,所以需要查询@_proc_name_2。


封装成方法后的代码

import pymysql


def callpro_sql(proc_name: str, return_sub: list, *args):
    '''
    调用存储过程
    :param proc_name: 存储过程名称
    :param return_sub: 返回值下标列表
    :param args: 存储过程参数
    :return:
    '''
    try:
        db = pymysql.connect(host='rm-****.mysql.rds.aliyuncs.com', port=3306, user='root', password='*****', db='*****')
        # 使⽤cursor()⽅法获取操作游标
        cursor = db.cursor(pymysql.cursors.DictCursor)
        cursor.callproc(proc_name, args)
        db.commit()
        # 获取数据
        data = cursor.fetchall()
        params = ",".join("@_{}_{}".format(proc_name, i) for i in return_sub)
        s_result_sql = "select {}".format(params)
        print(s_result_sql)
        cursor.execute(s_result_sql)
        result = cursor.fetchone()
        # 关闭数据库连接
        db.close()
    except Exception as e:
        data = 'error'
        result = {}
    return data, result


callpro_sql("test_proc", [1, 2], "param_0_test", "param_1_test", "param_2_test", "param_3_test", "param_4_test")

 

你可能感兴趣的:(Python,mysql)