Python 43 视图 、sql注入问题 、事务 、存储过程
一:视图
- 1 视图是什么?
本质是一张虚拟的表,他的数据来自select语句
创建视图
create view test_view select *from t1;- 2 有什么用?
原表安全- 案例:
在一个公司中需要一张表保存所有人的薪资信息,这个表不是所有人都能看到,只有老板和财务可以,任何一个员工只能看到自己的信息,所以不能把整个表的信息开放给员工- 功能1:隐藏部分数据,开放指定的数据
功能2:因为视图可以将查询结果保存特性,可以用视图来达到减少书写sql的次数
案例:select *from emp where dept_id = (select id from dept where name = "市场");
要查询市场的人
将调查结果作为一个视图,以后再使用到这个需求,就直接查看视图
对视图进行的查询- 3 如何使用?
创建视图:create view test_view as select *from t1;
特点:
1、每次对视图进行查询,其实都是再次执行了as后面的查询语句
2、可以对视图进行修改,修改会同步到原表
3、视图是永久存储的,存储的不是数据,就是一条as sql语句- 基本不用,因为你的程序开放的数据不是开放sql的语句,而开放的是查询结果
二:sql注入问题
- sql注入攻击是什么意思?
一些了解sql语法的用户,可以输入一些关键字或合法sql
来导致原始的sql逻辑发生变化,从而跳过登录验证或者删除数据库
如何避免在接受用户输入的数据发生变化,从而跳过登录验证或者删除数据库
上面这种方式只能避免,黑客从你的客户端软件注入sql
但是无法避免中间人攻击(在客户端和服务器中间加一个中转服务器)
这样就绕过了客户端的输入限制,此时只能将sql合法性验证放在服务器端- 总结:Python如何避免sql注入?
把自己的sql(用户输入的)参数放execute函数的arg参数中,让pymysql自动帮你屏蔽注入攻击- #自己的理解
客户端发给数据库服务器经过路由器, 然后被中间人截获客户端发的个人信息, 比如说,本来客户端的密码是123, 然后被中间人截获后将密码改成321再发送给服务端,
笼统的讲,就是你有一个快递, 本来是拿了快递后直接打包发给你, 但是这时候出现一个中间人,他拿了你的快递, 发现是个好东西,然后自己拿走,再放个别的东西寄给你,
三:事务
- 生活中的事务,你可以理解为事情,一件事情要完成通常不可能一步到位,需要拆分多个小步骤
举例 请你帮我买水
1、给你钱
2、你去买水
3、你给钱
4、拿水找钱
5、把水给我- 在mysql中,事务是什么?
是一组sql语句集合
事务的特性
1、原子性
事务是一个整体,不可分割- 2、隔离性
事务之间要相互隔离,避免导致数据错乱,为了维护数据完整性:
举例:
你有一张银行卡,第一次查看余额发现有1000元就开开心心买东西去了,买完东西回来付钱,再一查发现余额不足 ,原来你在第一次查询后,你的媳妇把钱转走了- 这个问题称为不可重复读,如何避免?
当我在查的时候你不能修改,查询和修改不能同时进行- 因为并发访问,导致的一些问题
1、脏读 一个事务读到了另一个事务未提交的数据,查询之前要保证所有的更新都已经完成
2、幻读 一个查询事务没有结束时,数据被另一个事务执行insert delete
3、不可重复读 一个事物在查询另一个事务在update- 四种隔离级别
读未提交
读已提交
可重复读 默认
串行化- 3、一致性
当事务执行后 所有的数据都是完整的(外键约束 非空约束)- 4、持久性
一旦事务提交 数据就永久保存
强调:事务就是一堆sql语句的集合 他们是原子性的要么全部指向性 要么都不执行- mysql这个客户端 默认 开启自动提交,一条sql语句就是一个单独的事务
pymysql 默认|是不自动提交,需要手动commit 意思是默认就开启了事务- 事务需要掌握的就是
start transaction 开启一个事物
commit 提交事物
rollback 回滚事务
四:存储过程
- 存储过程是什么?
你可以理解为mysql的编程
为什么有了Python还要学习这种编程语言?- 作用:可以将你的程序业务逻辑放到mysql中来处理,这样可以降低网络访问次数,从而提高你的程序效率
- 既然如此,能不能把所有与数据存储相关的业务逻辑全都放到mysql中?
在技术面前:能
但是对于公司而言,需要再请一个mysql开发者,对于你个人来说,提高沟通成本,比如说意见上的不统一
三种开发的模型
对于同一个业务,你可以放到Python也可以放到mysql,有什么区别?
1、应用程序,处理逻辑
需要手动编写sql语句
优点:执行效率高
缺点:开发效率低
mysql
2、应用程序
mysql 处理逻辑
特点:应用程序开发者不需要手动编写sql语句
mysql开发者来编写
优点:应用程序开发效率高
缺点:执行效率偏低,沟通成本增加- 3、使用ORM(object relation map) 对象关系映射
自动帮你生成对应的sql语句,比如说,你要注册用户,
本来要写insert语句,现在使用orm调用save(用户对象)
优点:开发效率高
缺点:执行效率降低- 存储过程相当于Python中的一个函数,简单的说,学习存储过程就是学习如何使用mysql编写一个函数
- 语法:
create procdure 过程的名称({in,out,inout} 数据类型 参数名称)
begin
具体的sql代码
end数据
参数前面需要指定参数的作用
in 表示该函数用于传入数据
out 用于返回数据
inout 可传入,也可返回- 参数类型是mysql中的数据类型
- 案例一:创建一个存储过程,作用是将两个整数相加
- create procedure add_p (in a int,in b int)
- begin
- select a + b;
- end
- //
案例一:
- 调用 call add_p(1,2)
- 案例二:创建一个存储过程 作用是将两个整数相加 将结果保存在变量中
- 定义一个变量
- set @su = ;
- create procedure add_p2 (in a int,in b int,out su int)
- begin
- set su = a + b;
- end
- //
案例二:
- 定义变量 set @su = 100;
调用过程 call add_p2(10,20,@su);
注意:在存储过程中,需要使用分号来结束一行,但分号有特殊含义,得将原始的结束符,修改为其他符号
delimiter // 结束符更换为 //
delimiter;- mysql中的if语句
if条件then
代码- elseif 条件 then
代码- else then
代码- end if;
- 案例三:使用存储过程完成输入一个数字1或2,显示:壹 或 贰
- create procedure show_p (in a int)
- begin
- if a = then
- select "壹";
- elseif a = then
- select "贰";
- else
- select "other";
- end if;
- end //
案例三:
- 调用存储过程,使用call过程名称
call abb_p(10,20);
其他的流程控制
switch
case
while
repeat == do while- 总结:实际上一个mysql中的类似函数的东西,我们可以用它实现一些逻辑处理
特点:里面可以包含流程控制语句和普通的sql语句- 使用存储过程的优势
提高应用程序开放效率
降低网络访问次数
Python 43 视图 、sql注入问题 、事务 、存储过程的更多相关文章
- 视图,sql注入问题,事物,存储过程
视图:本质是一张虚拟的表数据来自select语句用途是保障原表安全 功能1:隐藏部分数据,开放指定数据功能2:因为视图可以将查询结果保存的特性,我们可以用视图来达到减少书写sql语句的功能 例如:se ...
- Python中防止sql注入的方法详解
SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库.下面这篇文章主要给大家介绍了关于Python中 ...
- 06 数据库入门学习-视图、sql注入、事务、存储过程
一.视图 1.什么是视图 视图本质是一张虚拟的表 2.为什么要用 为了原表的安全 只要有两大功能 1.隐藏部分数据,开放指定数据 2.视图可以将查询结果保存,减少sql语句的次数 特点: 1.视图使用 ...
- sql注入及事务
Statement会有一个关于sql注入的bug ,所以基本不使用 一般使用PreparedStatement import java.sql.Connection;import java.sql.P ...
- python 打造一个sql注入脚本 (一)
0x00前言: 昨天刚刚看完小迪老师的sql注入篇的第一章 所以有了新的笔记. 0x01笔记: sql注入原理: 网站数据传输中,接受变量传递的值未进行过滤,导致直接带入数据库查询执行的操作. sql ...
- python番外篇--sql注入
一.sql注入概念介绍 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意的)S ...
- Statement和PreparedStatement的区别; 什么是SQL注入,怎么防止SQL注入?
问题一:Statement和PreparedStatement的区别 先来说说,什么是java中的Statement:Statement是java执行数据库操作的一个重要方法,用于在已经建立数据库连接 ...
- 预处理prepareStatement是怎么防止sql注入漏洞的?
序,目前在对数据库进行操作之前,使用prepareStatement预编译,然后再根据通配符进行数据填值,是比较常见的做法,好处是提高执行效率,而且保证排除SQL注入漏洞. 一.prepareStat ...
- 开发反模式 - SQL注入
一.目标:编写SQL动态查询 SQL常常和程序代码一起使用.我们通常所说的SQL动态查询,是指将程序中的变量和基本SQL语句拼接成一个完整的查询语句. string sql = SELECT * FR ...
随机推荐
- day02 python
列表: : 在[ ]内,可以存放多个任意类型的值: 并以逗号隔开. 一般用于存放学生的爱好:课堂的周期等等... 例如: 定义一个学生列表,可存放多个学生 list(['钱垚', '李小龙', '张全 ...
- Redis事物及锁的运用
redis与mysql事物比较如下: 下面是一个redis事物运用于买票的demo
- 关于css定位的一些总结
#pay_pic{ overflow: hidden; width: 200px; margin: 0 auto; } table.dataintable { margin-top: 15px; bo ...
- HUD 1426 Sudoku Killer (DFS)
链接 : Here! 思路 : 记录下所有 "?" , 出现的位置, 然后 $DFS$ 一下, 对于每个位置来说都可以填充 $9$ 种数值, 然后对于判断填充是否合法需要三个标记数 ...
- CentOS7.2下安装php加速软件Xcache
说明: php安装目录:/usr/local/php php.ini配置文件路径:/usr/local/php/etc/php.ini Nginx安装目录:/usr/local/nginx Nginx ...
- MySQL中是索引
MySQL中是索引: --.唯一索引: 一行中的内容不能一样, create t2( id int , num int, unique weiyisuiyin (id,num) ) --唯一; --约 ...
- socket 网络编程笔记 一
初始socket模块 Serve端代码 import socket sk = socket.socket() #默认为TCP连接 """socket 里面两个方法 fam ...
- 关于框架搭建-web
最近一直在学习前端相关的东西,在学了一堆基础可以以及动手在某个前端框架上写了一些东西之后,我想尝试着开始自己搭建一个框架.不知道时间需要多久,但会持续更新.小菜鸟的成长记录. ------------ ...
- 【[Offer收割]编程练习赛12 A】歌德巴赫猜想
[题目链接]:http://hihocoder.com/problemset/problem/1493 [题意] [题解] 枚举P从2..n/2 如果P是质数且N-P也是质数; 则输出P和N-P就好; ...
- Spring+SpringMVC+MyBatis整合教程
1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One ...