Python pymysql調用存儲過程

使用pymysql調用存儲過程

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")

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章