1. 前言

关于 Python 数据处理,之前有写过一系列文章
如果项目涉及复杂的 SQL 处理,就可以将这些操作封装成「 存储过程 」,公开入参及出参,方便直接调用
本篇文章将聊聊如何使用 Python 执行存储过程

2. 存储过程

存储过程,全称为「 Stored Procedure 
可以将它看成一个接口,内部会封装一些常用的操作,可以直接进行调用
存储过程的常见操作如下:

2-1  管理存储过程
  • 创建
  • 查询
  • 删除
1
、创建一个存储过程

# 存储过程名称为:xag

delimiter $

create 
procedurexag()
begin
...

end
 $


# 2.1 通过数据库名查询所有存储过程

# 比如:数据库名为
xag
select
 `
name
frommysql
.
procwheredb
 = '
xag
and
 `
type
` = '
PROCEDURE
';


2.2
 查询存储过程中状态信息

show 
procedurestatus;

3
.通过存储过程名称,删除一个存储过程

DROP 
PROCEDUREIFEXISTSxag;
其中
使用「 create procedure 存储过程名称 」创建一个存储过程,接着在 begin 和 end 之间编写具体的操作逻辑
2-2  变量定义及赋值
使用关键字「 declare
」可以定义一个变量

# 变量定义
# 比如:定义一个变量name,类型为字符串
# 默认值为 null
...

declarenamevarchar
(
255
defaultnull
;

...

给变量赋值有 2 种方式:普通 set 语法、select into 语法
其中
  • set 语法可以通过表达式设置变量的值
  • select into 语法是通过查询数据库表,将查询结果设置到变量中
# 变量定义
declarenamevarchar
(
255
defaultnull
;


# 变量赋值
# set语法
setname
 = 
'xag'
;


# select into语法
# 查询name_table表中的第一条记录中的name值,保存到name变量中
selectnameintonamefrom
 name_table 
limit1
;

2-3  条件判断 if
比如,通过年龄判断年级( if 语句)

...

declare
 age int 
default23
;

declare
 grade varchar(
255
default
 null;


if语句
if
 age <=
5then
set
 grade = 
'幼儿园';
elseif
 age >= 
6and
 age < 
12then
set
 grade = 
'小学';
elseif
 age >=
12and
 age < 
15then
set
 grade = 
'初中';
elseif
 age >=
15and
 age < 
18then
set
 grade = 
'高中';
elseif
 age >=
18then
set
 grade = 
'其他';
endif
;

...

2-4  循环 while
比如,计算 1-10 数值的和,设置到变量 total 上
...

# 总和
declare
 total int 
default0
;


# 结束值
declare
 end_number int 
default10
;


# 临时值
declare
 temp int 
default0
;


# while循环
while
 temp <= end_number 
do
# 设置值
set
 total = total + temp;

set
 temp = temp + 
1
;

endwhile
;

...

2-5  入参和出参
为了使编写的存储过程更加实用,我们需要在常见存储过程时,设置出参和入参
语法格式如下:
# 创建一个存储过程

create 
procedureproce_name([in/out/inout] 参数名 参数类型)
其中
  • 默认传入值为入参,即 in
  • out 代表出参,作为返回值返回
  • 如果设置为 inout,则代表既能作为出参,也可以作为入参

3. 实战一下

使用 Python 调用存储过程非常方便
首先,我们编写一个存储过程
比如,我这里定义了一个存储过程,传入两个入参和一个出参,将两个入参的乘积作为出参返回

# 定义一个存储过程

delimiter $

create 
procedurenum_multi(in num1 int,in num2 int,out multiply_result int)
begin
# 两个入参相乘,然后设置到出参中去

setmultiply_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 循环可以自己去扩展学习
ps:本文为该系列文章第六篇,关注【Python开发者】公众号,锁定更多精彩内容
- EOF -
推荐阅读点击标题可跳转
觉得本文对你有帮助?请分享给更多人
推荐关注「Python开发者」,提升Python技能
点赞和在看就是最大的支持❤️
继续阅读
阅读原文