mysql的函数与储存过程与pymysql的配合使用
Posted accolade
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql的函数与储存过程与pymysql的配合使用相关的知识,希望对你有一定的参考价值。
现在mysql上定义一个函数,一个储存过程
函数:
delimiter \ CREATE FUNCTION f2 ( num2 INT, num1 INT ) RETURNS INT BEGIN DECLARE a DEFAULT INT 1; SET a = num1 * num2; RETURN ( a ) ; END \ delimiter;
函数式是计算两个值相乘的
在mysql的调用
select f2(9,5); -- 45
同时函数可以是配合select 函数 from 来使用的;函数里面不能写select * from 这样的语言。
储存过程(或者是事物)
定义
delimiter \CREATE DEFINER=`root`@`localhost` PROCEDURE `p6`(inout check_num tinyint, inout num int) begin declare exit handler for SQLEXCEPTION begin set check_num=1; rollback; end; start transaction ; select * from class; set num = num *check_num; insert into class(caption)values(‘高三九班‘),(‘拒水小学wu年级九班‘); commit; select * from class; set check_num=2; end \ delimiter ;
在mysql上调用事物:
set @a=6; set @b=5; call p6(@a,@b); select @a,@b;
在mysql必须要定义一个全局的变量。然后传值,在查看值得变化,来判断事物是否执行成功,在事物的内部,会显示出来,但是如果有错误,便会对值不会进行修改,而且修改的值必须要进行commit才能修改或者上传成功。
我去,意外发现:
在mysql上定义事物p7
1 delimiter \ 2 3 CREATE DEFINER=`root`@`localhost` PROCEDURE `p7`(inout check_num tinyint, 4 inout num int) 5 begin 6 declare exit handler for SQLEXCEPTION 7 begin 8 set check_num=1; 9 rollback; 10 end; 11 12 start transaction ; 13 select * from class; 14 set num = num *check_num; 15 insert into class(caption)values(‘p7高三九班‘),(‘p7拒水小学wu年级九班‘); 16 commit; 17 select * from class; 18 insert into class(caption)values(‘p7高十八班‘,‘p7wu年级九班‘); 19 commit; 20 set check_num=2; 21 end \22 delimiter ;
你看一下定义的事物,你会发现18行是错误的写法,也就是说mysql会报错,然后我再去调用这个事物
set @a=6; set @b=5; call p7(@a,@b); select @a,@b;
发现@a=1 @b=30 就是说在12到17行的代码全部都调用了,而且因为里面有个commit所以说表class里面确实是添加(‘p7高三九班‘),(‘p7拒水小学wu年级九班‘)这两个变量。
结论:事物的本质是commit的使用,所以需要将检测的数字和commit放在最后,因为事物的代码是会执行的,执行到了错误地地方,才会走报错的地方,因此在写事物的时候,一定要注意commit的位置。
在pymysql里面调用函数和储存过程(以及事物)
import pymysql conn=pymysql.connect(host=‘localhost‘,user=‘root‘,password=‘‘,database=‘review60‘,charset=‘utf8‘) cursor=conn.cursor()#得到信息是以字典的形式 sql =‘select f2(3,4)‘ cursor.execute(sql) a=cursor.fetchall() print(‘f2(3,4)的返回值:‘,a) num1=3 num2=4 cursor.callproc(‘p6‘,(num1,num2))#[email protected]_p6_0,[email protected]_p6_1 print(‘第一次的p6返回值:‘,cursor.fetchall()) print(‘num1 num2:‘,num1,num2) cursor.execute(‘select @_p6_0‘) num1=cursor.fetchall()#成功返回2,失败返回1 print(‘查看返回值num1:‘,num1) cursor.execute(‘select @_p6_1‘) num2=cursor.fetchall()#返回num1 x num2 print(‘查看返回值num2:‘,num2) cursor.close() conn.close()
结果:
f2(3,4)的返回值: ((12,),) 第一次的p6返回值: 一个很长的列表 num1 num2: 3 4 查看返回值num1: ((2,),) 查看返回值num2: ((12,),)
。
以上是关于mysql的函数与储存过程与pymysql的配合使用的主要内容,如果未能解决你的问题,请参考以下文章
Six——tornado操作之用户表单(密码,用户名)数据库迁移使用SQLAlchemy+pymysql配合alembic实现!