6Python全栈之路系列之MySQL存储过程

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

Python全栈之路系列之MySQL存储过程


存储过程是一个SQL语句集合,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行。

存储过程过接收的参数

参数 描述
in 仅用于传入参数用
out 仅用于返回值用
inout 既可以传入又可以当作返回值

创建存储过程

创建一个简单的存储过程

1
2
3
4
5
6
7
8
9
10
11
12
13
- -  修改SQL语句的结束符为 %
delimiter  %
- -  创建这个存储过程先删除
DROP PROCEDURE IF EXISTS proc_p1  %
CREATE PROCEDURE proc_p1()
- -  开始
BEGIN
     - -  SQL语句块
     select  *  from  color;
- -  结束
END  %
- -  把SQL语句的结束符改为;
delimiter ;

通过call调用存储过程

1
call proc_p1();

输出为

1
2
3
4
5
6
7
8
+ -----+--------+
| nid | title  |
+ -----+--------+
|   1 | red    |
|   2 | yellow |
+ -----+--------+
rows  in  set  (0.00 sec)
Query OK, 0  rows  affected (0.01 sec)

删除存储过程

1
DROP  PROCEDURE  proc_p1;

实例

创建一个存储过程,接收一个参数,传入的参数就是显示数据的个数,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
delimiter  %
DROP PROCEDURE IF EXISTS proc_p1  %
create PROCEDURE proc_p1(
     - -  i1就是传入的参数,传入的数据类型必须是 int 类型
     in  i1  int
)
BEGIN
     - -  定义两个局部变量d1和d2,数据类型都为 int ,d1默认值为空,d2默认值为 1
     DECLARE d1  int ;
     DECLARE d2  int  DEFAULT  1 ;
     - -  d1的值等于传入过来的i1加上定义的局部变量d2的值
     SET  d1  =  i1  +  d2;
     - -  查找person_info表中的nid大于d1的数据
     SELECT  *  FROM person_info WHERE nid > d1;
END  %
delimiter ;

查询,括号内输入定义的参数

1
CALL proc_p1(4);

显示结果

1
2
3
4
5
6
7
8
9
10
+ -----+------+------------------+-------------+----------+----------+---------+-----------+
| nid |  name  | email            | phone       | part_nid | position | caption | color_nid |
+ -----+------+------------------+-------------+----------+----------+---------+-----------+
|   6 | w    |  as @anshengme.com | 13800138000 |        5 | Python   |  NULL     |       NULL  |
|   9 | aa   | a@ansheng.me     | 13800138000 |        3 | DBA      |  NULL     |         2 |
|  10 | b    | b.ansheng.me     | 13800138000 |        3 | DBA      |  NULL     |         1 |
+ -----+------+------------------+-------------+----------+----------+---------+-----------+
rows  in  set  (0.00 sec)
 
Query OK, 0  rows  affected (0.01 sec)

这次把nid大于5的数据全部输出出来了,传入的值是4,我们在内部让4+1了,所以就是大于5的数据.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
delimiter  %
DROP PROCEDURE IF EXISTS proc_p1  %
create PROCEDURE proc_p1(
     - -  接收了三个参数,类型都是 int
     in  i1  int ,
     inout ii  int ,
     out i2  int
)
BEGIN
     - -  定义一个局部变量d2,默认值是 3 ,数据类型为 int
     DECLARE d2  int  DEFAULT  3 ;
     - -  ii  =  ii  +  1
     set  ii  =  ii  +  1 ;
     - -  如果传入的i1等于 1
     IF i1  =  1  THEN
         - -  i2  =  100  +  d2
         set  i2  =  100  +  d2;
     - -  如果传入的i1等于 2
     ELSEIF i1  =  2  THEN
         - -  i2  =  200  +  d2
         set  i2  =  200  +  d2;
     - -  否则
     ELSE
         - -  i2  =  1000  +  d2
         set  i2  =  1000  +  d2;
     END IF;
END  %
delimiter ;

查看数据

1
2
3
set  @o  =  5 ;
CALL proc_p1( 1 ,@o,@u);
SELECT @o,@u;

显示的结果

1
2
3
4
5
6
+ ------+------+
| @o   | @u   |
+ ------+------+
|    6 |  103 |
+ ------+------+
1 row  in  set  (0.00 sec)

使用pymysql模块操作存储过程

Python代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import  pymysql
 
conn  =  pymysql.connect(host = "127.0.0.1" , port = 3306 , user = 'root' , passwd = 'as' , db = "dbname" )
cursor  =  conn.cursor(cursor = pymysql.cursors.DictCursor)
 
# 执行存储过程
row  =  cursor.callproc( "proc_p2" ,( 1 , 2 , 3 ))
# 存储过程的查询结果
selc  =  cursor.fetchall()
print (selc)
# 获取存储过程返回
effect_row  =  cursor.execute( 'select @_proc_p2_0, @_proc_p2_1, @_proc_p2_2' )
# 取存储过程返回值
result  =  cursor.fetchone()
print (result)
 
conn.commit()
cursor.close()
conn.close()

显示的结果

1
2
3
4
5
C:\Python\Python35\python.exe D: / PycharmProjects / pymysql_存储过程.py
[{ 'nid' 1 'name' 'man1' }, { 'nid' 2 'name' 'man2' }, { 'nid' 3 'name' 'man3' }]
{ '@_proc_p2_1' 3 '@_proc_p2_0' 1 '@_proc_p2_2' 103 }
 
Process finished with exit code  0

存储过程使用into

into其实就是把一个select的执行结果当作另一个select的参数,例如下面的实例:

1
2
3
4
5
6
7
8
9
10
11
12
delimiter  %
DROP PROCEDURE IF EXISTS proc_p2  %
CREATE PROCEDURE proc_p2()
BEGIN
     - -  定义一个局部变量n,类型为 int
     DECLARE n  int ;
     - -  获取color_nid  =  2 的数据并赋值给n
     SELECT color_nid into n FROM person_info where color_nid  =  2 ;
     - -  输出nid  =  n的数据
     SELECT  *  from  color WHERE nid  =  n;
END  %
delimiter ;

执行

call proc_p2();

结果

1
2
3
4
5
6
7
8
+ -----+--------+
| nid | title  |
+ -----+--------+
|   2 | yellow |
+ -----+--------+
1 row  in  set  (0.00 sec)
 
Query OK, 0  rows  affected (0.01 sec)









本文转自 Edenwy  51CTO博客,原文链接:http://blog.51cto.com/edeny/1925908,如需转载请自行联系原作者
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
20天前
|
存储 SQL 关系型数据库
轻松入门MySQL:加速进销存!利用MySQL存储过程轻松优化每日销售统计(15)
轻松入门MySQL:加速进销存!利用MySQL存储过程轻松优化每日销售统计(15)
|
25天前
|
缓存 NoSQL 关系型数据库
在Python Web开发过程中:数据库与缓存,MySQL和NoSQL数据库的主要差异是什么?
MySQL是关系型DB,依赖预定义的表格结构,适合结构化数据和复杂查询,但扩展性有限。NoSQL提供灵活的非结构化数据存储(如JSON),无统一查询语言,但能横向扩展,适用于大规模、高并发场景。选择取决于应用需求和扩展策略。
114 1
|
1月前
|
XML 关系型数据库 MySQL
python将word(doc或docx)的内容导入mysql数据库
用python先把doc文件转换成docx文件(这一步也可以不要后续会说明),然后读取docx的文件并另存为htm格式的文件(上一步可以直接把doc文件另存为htm),python根据bs4获取p标签里的内容,如果段落中有图片则保存图片。(图片在word文档中的位置可以很好的还原到生成的数据库内容) 我见网上有把docx压缩后解压获取图片的,然后根据在根据xml来读取图片的位置,我觉得比较繁琐。用docx模块读取段落的时候还需要是不是判断段落中有分页等,然而转成htm之后就不用判断那么多直接判断段落里的样式或者图片等就可以了。
22 1
|
1月前
|
SQL 关系型数据库 MySQL
Python怎么操作Mysql数据库
Python怎么操作Mysql数据库
51 0
|
1月前
|
SQL 关系型数据库 MySQL
python在mysql中插入或者更新null空值
这段代码是Python操作MySQL数据库的示例。它执行SQL查询从表`a_kuakao_school`中选取`id`,`university_id`和`grade`,当`university_id`大于0时按升序排列。然后遍历结果,根据`row[4]`的值决定`grade`是否为`NULL`。若不为空,`grade`被格式化为字符串;否则,设为`NULL`。接着构造UPDATE语句更新`university`表中对应`id`的`grade`值,并提交事务。重要的是,字符串`NULL`不应加引号,否则更新会失败。
20 2
|
4天前
|
SQL 关系型数据库 MySQL
Python与MySQL数据库交互:面试实战
【4月更文挑战第16天】本文介绍了Python与MySQL交互的面试重点,包括使用`mysql-connector-python`或`pymysql`连接数据库、执行SQL查询、异常处理、防止SQL注入、事务管理和ORM框架。易错点包括忘记关闭连接、忽视异常处理、硬编码SQL、忽略事务及过度依赖低效查询。通过理解这些问题和提供策略,可提升面试表现。
25 6
|
13天前
|
JavaScript 前端开发 Docker
全栈开发实战:结合Python、Vue和Docker进行部署
【4月更文挑战第10天】本文介绍了如何使用Python、Vue.js和Docker进行全栈开发和部署。Python搭配Flask创建后端API,Vue.js构建前端界面,Docker负责应用的容器化部署。通过编写Dockerfile,将Python应用构建成Docker镜像并运行,前端部分使用Vue CLI创建项目并与后端交互。最后,通过Nginx和另一个Dockerfile部署前端应用。这种组合提升了开发效率,保证了应用的可维护性和扩展性,适合不同规模的企业使用。
|
14天前
|
存储 SQL 关系型数据库
mysql存储过程示例
mysql存储过程示例
11 0
|
1月前
|
Python
老男孩&路飞学城Python全栈
老男孩&路飞学城的Python全栈开发重点班由ALEX老师主讲,核心教学内容,100多天课程,近100G资料,含基础到实战。一线技术专家亲授,以案例教学引导学生逐步进入项目实战。
20 1
老男孩&路飞学城Python全栈
|
1月前
|
存储 关系型数据库 MySQL
Mysql基础第二十六天,使用存储过程
Mysql基础第二十六天,使用存储过程
28 0
Mysql基础第二十六天,使用存储过程