你們好,我是安果!mysql
關於 Python 數據處理,以前有寫過一系列文章sql
最全總結 | 聊聊 Python 數據處理全家桶(Mysql 篇)數據庫
最全總結 | 聊聊 Python 數據處理全家桶(Sqlite篇)函數
最全總結 | 聊聊 Python 數據處理全家桶(MongoDB 篇)oop
最全總結 | 聊聊 Python 數據處理全家桶(Redis篇)學習
最全總結 | 聊聊 Python 數據處理全家桶(Memcached篇)測試
若是項目涉及複雜的 SQL 處理,就能夠將這些操做封裝成「 存儲過程 」,公開入參及出參,方便直接調用fetch
本篇文章將聊聊如何使用 Python 執行存儲過程3d
存儲過程,全稱爲「 Stored Procedure 」code
能夠將它當作一個接口,內部會封裝一些經常使用的操做,能夠直接進行調用
存儲過程的常見操做以下:
2-1 管理存儲過程
建立
查詢
刪除
# 一、建立一個存儲過程 # 存儲過程名稱爲:xag delimiter $ create procedure xag() begin ... end $ # 2.1 經過數據庫名查詢全部存儲過程 # 好比:數據庫名爲xag select `name` from mysql.proc where db = 'xag' and `type` = 'PROCEDURE'; # 2.2 查詢存儲過程當中狀態信息 show procedure status; # 3.經過存儲過程名稱,刪除一個存儲過程 DROP PROCEDURE IF EXISTS xag;
其中
使用「 create procedure 存儲過程名稱 」建立一個存儲過程,接着在 begin 和 end 之間編寫具體的操做邏輯
2-2 變量定義及賦值
使用關鍵字「 declare」能夠定義一個變量
# 變量定義 # 好比:定義一個變量name,類型爲字符串 # 默認值爲 null ... declare name varchar(255) default null; ...
給變量賦值有 2 種方式:普通 set 語法、select into 語法
其中
set 語法能夠經過表達式設置變量的值
select into 語法是經過查詢數據庫表,將查詢結果設置到變量中
# 變量定義 declare name varchar(255) default null; # 變量賦值 # set語法 set name = 'xag'; # select into語法 # 查詢name_table表中的第一條記錄中的name值,保存到name變量中 select name into name from name_table limit 1;
2-3 條件判斷 if
好比,經過年齡判斷年級( if 語句)
... declare age int default 23; declare grade varchar(255) default null; # if語句 if age <=5 then set grade = '幼兒園'; elseif age >= 6 and age < 12 then set grade = '小學'; elseif age >=12 and age < 15 then set grade = '初中'; elseif age >=15 and age < 18 then set grade = '高中'; elseif age >=18 then set grade = '其餘'; end if; ...
2-4 循環 while
好比,計算 1-10 數值的和,設置到變量 total 上
... # 總和 declare total int default 0; # 結束值 declare end_number int default 10; # 臨時值 declare temp int default 0; # while循環 while temp <= end_number do # 設置值 set total = total + temp; set temp = temp + 1; end while; ...
2-5 入參和出參
爲了使編寫的存儲過程更加實用,咱們須要在常見存儲過程時,設置出參和入參
語法格式以下:
# 建立一個存儲過程 create procedure proce_name([in/out/inout] 參數名 參數類型)
其中
默認傳入值爲入參,即 in
out 表明出參,做爲返回值返回
若是設置爲 inout,則表明既能做爲出參,也能夠做爲入參
使用 Python 調用存儲過程很是方便
首先,咱們編寫一個存儲過程
好比,我這裏定義了一個存儲過程,傳入兩個入參和一個出參,將兩個入參的乘積做爲出參返回
# 定義一個存儲過程 delimiter $ create procedure num_multi(in num1 int,in num2 int,out multiply_result int) begin # 兩個入參相乘,而後設置到出參中去 set multiply_result = num1 * num2; end $
而後,在數據庫中進行調用測試
使用關鍵字「 call 」調用存儲過程,使用 select 查看返回值
# 調用存儲過程 call num_multi(1,3,@multiply_result); select @multiply_result;
接着,利用數據庫配置信息建立鏈接及遊標對象
import pymysql PY_MYSQL_CONN_DICT = { "host": '127.0.0.1', "port": 3306, "user": 'root', "passwd": 'root', "db": 'test_db' } # 數據庫鏈接 db_conn = pymysql.connect(**PY_MYSQL_CONN_DICT) # 遊標 db_cursor = db_conn.cursor(cursor=pymysql.cursors.DictCursor)
最後,使用函數「 callproc 」調用存儲過程名稱及全部參數,獲取返回值
在執行完存儲過程後,須要經過遊標對象的「 execute 」函數獲取出參及入參
db_cursor.callproc('num_multi', args=(3, 6, -1)) # 獲取入參及出參 db_cursor.execute('SELECT @_num_multi_0, @_num_multi_1, @_num_multi_2') # 出參值 output_result = db_cursor.fetchone()['@_num_multi_2'] # 出參值 print(output_result)
須要注意的是,若是存儲過程涉及到更新、新增等操做,須要顯式調用 commit() 函數,纔會真正提交到數據庫中
上面僅僅羅列出存儲過程的常見語法,包含 case 條件分支處理、repeat 和 loop 循環能夠本身去擴展學習
若是你以爲文章還不錯,請你們 點贊、分享、留言 下,由於這將是我持續輸出更多優質文章的最強動力!