zoukankan      html  css  js  c++  java
  • 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 = 100;
                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 = 1 then
                    select "";
    
                elseif a = 2 then
                    select "";
    
                else
                    select "other";
                end if;
                end //
    案例三:
    调用存储过程,使用call过程名称
    call abb_p(10,20);
    其他的流程控制
    switch
    case
    while
    repeat == do while

    总结:实际上一个mysql中的类似函数的东西,我们可以用它实现一些逻辑处理
    特点:里面可以包含流程控制语句和普通的sql语句

    使用存储过程的优势
    提高应用程序开放效率
    降低网络访问次数

     

    
    
    
    
    
    
  • 相关阅读:
    GZOI 2017配对统计 树状数组
    关于线段树的一些问题
    BZOJ 压力 tarjan 点双联通分量+树上差分+圆方树
    洛谷4552 差分
    洛谷5026 Lycanthropy 差分套差分
    【锁】MySQL和Oracle行锁比较
    oracle体系结构
    【加密】RSA验签及加密
    【Shiro】SpringBoot集成Shiro
    【Eureka】实现原理
  • 原文地址:https://www.cnblogs.com/zedong/p/9670828.html
Copyright © 2011-2022 走看看