灵虚御风
醉饮千觞不知愁,忘川来生空余恨!

导航

 
复习:  
老师  博客地址:(数据库类)https://lupython.gitee.io
 
PyMySQL:
  Python语言去操作MySQL的包
  格式:
‘’‘
 import pymysql
 
 注意:
  a.文件名不能写自己本身
  b.connect(连接) ----> conn(指挥) ----> cursor(游标)
  c.执行sql语句  ---> execute(sql)      (#执行)
  d.取数据:
   fetchone()
   fetchall()
   fetchamany(size)
  e.增加删除:
   conn.commit()#提交任务
 
 

今日内容:
 PyMySQL: (*******************************)
1.“SQL注入”安全问题 ****** 
2.事务***********
3.视图
4.函数
5.存储过程
6.触发器
 
 PyMySQL: (*******************************)
1.“SQL注入”问题
1.1什么是.“SQL注入”问题?
a. 登录验证
      写sql语句的时候, %传值的时候, 需要加引号:
      sql = "select * from t4 where name = '%s' and pwd = '%s'" % (username, pwd)
  
上面的sql语句带来的风险是:

     例一:
     username = zekai' #
     
     select * from t4 where name = 'zekai' #' and pwd = ''
    
    例二:
     username = dbsahvbdsha' or 1=1 #
     
     select * from t4 where name = 'dbsahvbdsha' or 1=1
    
   上面出现的问题,我们称之为 SQL注入  (**********************************)
   
   出现问题的根源是:
    
    因为太过于相信用户的输入, 导致我们在接受用户输入的参数的时候, 并没有对他进行转义
   
1.2解决“SQL注入”方法::
    
        1. 自己手工对用户输入的值进行转义
    
       2. 使用execute()自动进行过滤
    
     sql = "select * from t4 where name = %s and pwd = %s"
     cursor.execute(sql,(username, pwd))
   
   #$## 插入一条
   cursor.execute(sql, ('lxxx', '1234'))
   ### 插入多条
   data = [
    ('aaaaa', 'aaa'),
    ('bbbb', 'bbb'),
    ('ffff', '666'),
    ('rrrr', '888'),
   ]
   cursor.executemany(sql, data)
 
 
   try:
    cursor.execute(sql, ('lxxx', '1234'))
    
    ###  删除和更新的时候, 需要事物提交
    conn.commit()
   except Exception as e:
    conn.rollback()
 
  
   cursor.lastrowid : 最后一行的行数
  
 
 
 事务: (**************************************************************************************************)
  一组操作, 要么都成功, 要么都失败
  
  特性:
   原子性: 一组操作, 要么都成功, 要么都失败
   一致性(Consistency):指事务发生前和发生后,数据的总额依然匹配
   隔离性(Isolation):简单点说,某个事务的操作对其他事务不可见的
   持久性(Durability):当事务完成后,其影响应该保留下来,不能撤消,只能通过“另开起一个事物”来抵消之前的错误
  
  场景:
   思考:
    我去银行给朋友汇款,
    我卡上有1000元,
    朋友卡上500元,
    我给朋友转账100元(无手续费),
    如果,网线断了, 我的钱刚扣,而朋友的钱又没加时, 怎么办?
   
   create table t11 (
    id int auto_increment primary key,
    name varchar(32) not null default '',
    money int not null default 0
   )engine=Innodb  charset=utf8;
   
   insert into t11 (name,money) values ('zekai', 1000), ('eagon', 500);
   
  
  解决方法:
  
   开启事务 (start transaction)
   
   (执行sql操作)
   
   commit : 提交上面的SQL, 让其生效
   
   rollback: 回滚
   
   show full tables;  显示全部类型
  
  --------------------------------------------------------------------------
  
下面这些了解:
 
 视图:
  
  产生的原因:
   如果有一个SQL语句频繁的会被使用到,比如说:
    select * from t4 where id>12 and id <24;
  
  搞一个映射,或者取一个别名
    select * from t4 where id>12 and id <24   === > v1
  视图:
  
   select * from v1;
   
  创建视图:
   
   create view v1 as select * from t4 where id>12 and id <24;
  
  修改视图:
   alter view v1 as sql语句;
   
  删除视图:
   drop view v1;
   
  
  问题:
   如果原生的表数据发生了变化, 那视图会不会发生变化? 也会变化
   
   视图中的数据会不会发生修改? 不会发生修改
   
  应用场景:
   
   MySQL: (DBA)
    生成视图View
   
   程序:
    调用  select  * from v1;
 
 
 
 函数:
  
  不要轻易使用
  
  在程序中, 用代码计算, 计算好了, 再传给SQL语句执行
 
 
 存储过程:
  
  将一大堆 SQL 语句进行封装, 类似于函数, 结果就是存储过程
  
  MySQL服务端:
   DBA (写)
  
  
  a. 简单的存储过程:
   delimiter //
   create procedure p1()
   BEGIN
    select * from t11;
   END //
   delimiter ;
   
   程序:
    call p1();
  
  b. 传参数: (in)
   delimiter //
   create procedure p2(
    in n1 int,
    in n2 int
   )
   BEGIN
    select * from t11 where id > n1;
   END //
   delimiter ;
   
   程序:
    call p2(12, 2)
  
  c. 传入参数: (out)
   
   delimiter //
   create procedure p3(
    in n1 int,
    out n2 int
   )
   BEGIN
    select * from t11 where id > n1;
    set n2 =  1;
   END //
   delimiter ;
   
   
   set @v2=123212;
   call p3(12, @v2);
   
   select @v2;
   
   
 触发器:
  
  向用户表中添加一条数据的同时, 在日志表中也添加一条记录
  
  delimiter //
  CREATE TRIGGER t1 BEFORE INSERT ON t7 FOR EACH ROW
  BEGIN
   insert into t11 (name, money) values ('xxx', 1234);
  END //
  delimiter ;
  
posted on 2019-06-17 14:48  没有如果,只看将来  阅读(235)  评论(0编辑  收藏  举报