你们好,我是安果!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 循环能够本身去扩展学习
若是你以为文章还不错,请你们 点赞、分享、留言 下,由于这将是我持续输出更多优质文章的最强动力!