最全總結 | 聊聊 Python 數據處理全家桶(存儲過程篇)

1. 前言

大家好,我是安果!

關於 Python 數據處理,之前有寫過一系列文章

最全總結 | 聊聊 Python 數據處理全家桶(Mysql 篇)

最全總結 | 聊聊 Python 數據處理全家桶(Sqlite篇)

最全總結 | 聊聊 Python 數據處理全家桶(MongoDB 篇)

最全總結 | 聊聊 Python 數據處理全家桶(Redis篇)

最全總結 | 聊聊 Python 數據處理全家桶(Memcached篇)

如果項目涉及複雜的 SQL 處理,就可以將這些操作封裝成「 存儲過程 」,公開入參及出參,方便直接調用

本篇文章將聊聊如何使用 Python 執行存儲過程

2. 存儲過程

存儲過程,全稱爲「 Stored Procedure 」

可以將它看成一個接口,內部會封裝一些常用的操作,可以直接進行調用

存儲過程的常見操作如下:

2-1  管理存儲過程

  • 創建

  • 查詢

  • 刪除

# 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,則代表既能作爲出參,也可以作爲入參

3. 實戰一下

使用 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() 函數,纔會真正提交到數據庫中

4. 最後

上面僅僅羅列出存儲過程的常見語法,包含 case 條件分支處理、repeat 和 loop 循環可以自己去擴展學習

如果你覺得文章還不錯,請大家 點贊、分享、留言 下,因爲這將是我持續輸出更多優質文章的最強動力!

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