Python-视图 触发器 事务 存储过程
1.视图
2.触发器***
在某个时间发生了某个事件时 会自动触发一段sql语句
3.事务*****
4.存储过程***** 5.函数
6.备份与恢复***
mysqldump -u -p (库名 [表名] | --all--databases --databases 库名1 库名2) > 文件路径
恢复
1.mysql -u -p < 文件路径
2.source 文件路径
7.流程控制 ----------------
1. 视图
视图是一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】,
用户使用时只需使用【名称】即可获取结果集,可以将该结果集当做表来使用。 使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,
这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,
但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,
即强耦合,那就意味着扩展sql极为不便,因此并不推荐使用
100个SQL:
88: v1 select .. from v1
select asd from v1
某个查询语句设置别名,日后方便使用 - 创建
create view 视图名称 as SQL PS: 虚拟
- 修改
alter view 视图名称 as SQL - 删除
drop view 视图名称; 2. 触发器 当对某张表做:增删改操作时,可以使用触发器自定义关联行为 insert into tb (....) -- delimiter //
-- create trigger t1 BEFORE INSERT on student for EACH ROW
-- BEGIN
-- INSERT into teacher(tname) values(NEW.sname);
-- INSERT into teacher(tname) values(NEW.sname);
-- INSERT into teacher(tname) values(NEW.sname);
-- INSERT into teacher(tname) values(NEW.sname);
-- END //
-- delimiter ;
-- -- insert into student(gender,class_id,sname) values('女',1,'陈涛'),('女',1,'张根'); -- NEW,代指新数据
-- OLD,代指老数据 3.事务*****
是逻辑上的一组sql语句 他们要么都成功 要么都失败 今后只要执行sql就会有事务
使用事务
start transaction; --开启事物,在这条语句之后的sql将处在同一事务,并不会立即修改数据库 commit;--提交事务,让这个事物中的sql立即执行数据的操作, rollback;--回滚事务,取消这个事物,这个事物不会对数据库中的数据产生任何影响 四个特性
原子性:事务是一组不可分割的单位,要么同时成功,要么同时不成功
一致性: 事物前后的数据完整性应该保持一致
隔离性:多个用户并发访问数据时,一个用户的事物不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离
持久性:一个事物一旦被提交,它对数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
四个隔离级别
读未提交:read uncommitted --不做任何隔离,可能脏读,幻读
读已提交:read committed----可以防止脏读,不能防止不可重复读,和幻读,
可重复读:Repeatable read --可以防止脏读,不可重复读,不能防止幻读
序列化执行(串行):Serializable--数据库运行在串行化实现,所有问题都没有,就是性能低 修改隔离级别:
select @@tx_isolation;--查询当前级别
set[session|global] transaction isolation level .... ;修改级别
实例:
set global transaction isolation level Repeatable read ; pymysql事务测试
import pymysql conn = pymysql.connect(
user="root",
password="root",
database="day48",
charset="utf8"
) cursor = conn.cursor(pymysql.cursors.DictCursor)
# cursor.execute("delete from account where id =1")
# conn.commit() sql = "update account set money = money - 100 where id = 2"
sq2 = "update account set moneys = money + 100 where id = 3"
try:
cursor.execute(sql)
cursor.execute(sq2)
conn.commit()
print("提交了!")
except:
print("回滚了!")
conn.rollback()
# 把你需要放在同一事务的sql执行 放在try中 最后加上commit
# 如果捕获到异常则执行rollback 4. 函数
def f1(a1,a2):
return a1 + a2 f1()
bin() 内置函数:
执行函数 select CURDATE(); blog
id title ctime
1 asdf 2019-11
2 asdf 2019-11
3 asdf 2019-10
4 asdf 2019-10 select ctime,count(1) from blog group ctime select DATE_FORMAT(ctime, "%Y-%m"),count(1) from blog group DATE_FORMAT(ctime, "%Y-%m")
2019-11 2
2019-10 2 自定义函数(有返回值): delimiter \\
create function f1(
i1 int,
i2 int)
returns int
BEGIN
declare num int default 0;
set num = i1 + i2;
return(num);
END \\
delimiter ; SELECT f1(1,100); 4. 存储过程
保存在MySQL上的一个别名 => 一坨SQL语句 别名() 用于替代程序员写SQL语句 方式一:
MySQL: 存储过程
程序:调用存储过程
方式二:
MySQL:。。
程序:SQL语句
方式三:
MySQL:。。
程序:类和对象(SQL语句) 是一堆sql语句的集合,相当于一个py的函数
优点:
应用程序开发者,工作量降低,
提高程序的执行效率 因为网络io减少了
缺点:学习成本高,扩展性 维护性差
部门间沟通成本 pymysql调用存储过程
import pymysql conn = pymysql.connect(
user="root",
password="root",
database="day48",
charset="utf8"
) cursor = conn.cursor(pymysql.cursors.DictCursor) cursor.callproc("p1",(2,5,1)) #pymysql 会给参数全都创建对应的变量
# 命名方式 @_p1_0 @_p1_1 @_p1_2
print(cursor.fetchall()) # 如果过程中包含多个查询语句 得到的是第一条查询语句的结果 cursor.execute("select @_p1_2")
print(cursor.fetchone()) 1. 简单
create procedure p1()
BEGIN
select * from student;
INSERT into teacher(tname) values("ct");
END call p1()
cursor.callproc('p1')
2. 传参数(in,out,inout)
delimiter //
create procedure p2(
in n1 int,
in n2 int
)
BEGIN select * from student where sid > n1;
END //
delimiter ; call p2(12,2)
cursor.callproc('p2',(12,2)) 3. 参数 out
delimiter //
create procedure p3(
in n1 int,
inout n2 int
)
BEGIN
set n2 = 123123;
select * from student where sid > n1;
END //
delimiter ; set @v1 = 10;
call p2(12,@v1)
select @v1; set @_p3_0 = 12
ser @_p3_1 = 2
call p3(@_p3_0,@_p3_1)
select @_p3_0,@_p3_1 cursor.callproc('p3',(12,2))
r1 = cursor.fetchall()
print(r1) cursor.execute('select @_p3_0,@_p3_1')
r2 = cursor.fetchall()
print(r2) =======> 特殊
a. 可传参: in out inout
b. pymysql cursor.callproc('p3',(12,2))
r1 = cursor.fetchall()
print(r1) cursor.execute('select @_p3_0,@_p3_1')
r2 = cursor.fetchall()
print(r2) 为什么有结果集又有out伪造的返回值? delimiter //
create procedure p3(
in n1 int,
out n2 int 用于标识存储过程的执行结果 1,2
)
BEGIN
insert into vv(..)
insert into vv(..)
insert into vv(..)
insert into vv(..)
insert into vv(..)
insert into vv(..)
END //
delimiter ; 5. 游标 delimiter //
create procedure p6()
begin
declare row_id int; -- 自定义变量1
declare row_num int; -- 自定义变量2
declare done INT DEFAULT FALSE;
declare temp int; declare my_cursor CURSOR FOR select id,num from A;
declare CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; open my_cursor;
xxoo: LOOP
fetch my_cursor into row_id,row_num;
if done then
leave xxoo;
END IF;
set temp = row_id + row_num;
insert into B(number) values(temp);
end loop xxoo;
close my_cursor; end //
delimter ; 6. 动态执行SQL(防SQL注入) delimiter //
create procedure p7(
in tpl varchar(255),
in arg int
)
begin
1. 预检测某个东西 SQL语句合法性
2. SQL =格式化 tpl + arg
3. 执行SQL语句 set @xo = arg;
PREPARE xxx FROM 'select * from student where sid > ?';
EXECUTE xxx USING @xo;
DEALLOCATE prepare prod;
end //
delimter ; call p7("select * from tb where id > ?",9) ===> delimiter \\
CREATE PROCEDURE p8 (
in nid int
)
BEGIN
set @nid = nid;
PREPARE prod FROM 'select * from student where sid > ?';
EXECUTE prod USING @nid;
DEALLOCATE prepare prod;
END\\
delimiter ;
Python-视图 触发器 事务 存储过程的更多相关文章
- MySQL_视图/触发器/事务/存储过程/函数
视图.触发器.事务.存储过程.函数 视图 视图是一个虚拟表(非真实存在),其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用名称即可获取结果集,可以将该结果集当作表来使用 #创建视 ...
- MySQL 视图触发器事务存储过程函数
事务 致命三问 什么是事务:开启了一个包含多条SQL语句的事务,这些SQL语句要么都执行成功,要么有别想成功:例如A向B转账,二人账户并不属于一家银行,在转账过程中由于网络问题,导致A显示转账 成功 ...
- MySQL拓展 视图,触发器,事务,存储过程,内置函数,流程控制,索引,慢查询优化,数据库三大设计范式
视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view tea ...
- MySQL 视图 触发器 事务 存储过程 函数 流程控制 索引与慢查询优化
视图 1.什么是视图? 视图就是通过查询得到的一张虚拟表,然后保存下来,下次可直接使用 2.为什么要使用视图? 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图? create view ...
- MySQL——视图/触发器/事务/存储过程/函数/流程控制
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- MySQL视图,触发器,事务,存储过程,函数
create triggr triafterinsertcmdlog after insert on cmd_log FOR EACH ROW trigger_body .#NEW : 代表新的记录 ...
- Python11/26--mysql之视图/触发器/事务/存储过程
视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次用的时候直接使用即可 2.为什么用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 select * from ...
- day 7-20 视图,触发器,事务
一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- python 全栈开发,Day64(视图,触发器,函数,存储过程,事务)
昨日内容回顾 pymysql:属于python的一个模块 pip3 install pymysql conn = pymysql.connect(...,charset = 'uft8') 创建游标 ...
- python mysql 视图 触发器 事物 存储过程 用户授权 数据备份还原
###################总结########### 视图是一个虚拟表(非真实存在) 是跑在内存中的表,真实表是在硬盘上的表 使用视图我们可以把查询过程中的临时表摘出来,保存下来,用视图去 ...
随机推荐
- 如何用java语言实现C#中的ref关键字(按引用传递参数)的效果
https://www.cnblogs.com/nnngu/p/8300164.html
- jQuery漏洞
1.使用jQuery.append().jQuery.html()方法时,如果其中内容包含<script>脚本而没有经过任何处理的话,会执行它. 2.版本低于1.7的jQuery过滤用户输 ...
- asp.net mvc && asp.net 页面跳转
1.使用传统的Response.Redirect例如string url = "/account/create";Response.Redirect(url); 1.Server. ...
- 卷积中的full、same、valid
通常用外部api进行卷积的时候,会面临mode选择. 本文清晰展示三种模式的不同之处,其实这三种不同模式是对卷积核移动范围的不同限制. 设 image的大小是7x7,filter的大小是3x3 ...
- Kali Linux之常见后门工具介绍
1.Meterpreter 它是Metasploit框架中功能强大的后渗透模块.可以通过Meterpreter的客户端执行攻击脚本,远程调用目标主机上运行的Meterpreter服务端. 命令 作用 ...
- Linux常用命令(三)查看当前计算机各方面信息
1.查看cpu: top 2.查看当前linux版本:name -a 查看当前运行的内核版本:cat /pro/version 查看发行版本信息:cat /etc/issue 查看上面所有信息:lsb ...
- js 一个对象的属性名是一个变量怎么处理?
1.这种方法的属性(setAttrName)可以是一个变量. var obj = {}; obj[setAttrName] = 'Tom' 2.这样就可以动态的给js对象添加变量属性. var obj ...
- python第二天,list和tuple
概念:list是集合,且是可变集合,tuple是元组集合,不可变集合. 1.Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 主要知识点:初始化 ...
- android studio设置窗口颜色和字体
1.设置左边窗口颜色和字体: 设置中间代码编辑窗口:
- Linux 查看系统硬件信息[转]
原文:http://www.cnblogs.com/ggjucheng/archive/2013/01/14/2859613.html linux查看系统的硬件信息,并不像windows那么直观,这里 ...