6.15—043A—周六

今日内容:

    一、PyMySQL:

    二、事务:

    三、视图:

    四、函数:

    五、存储过程:

    六、触发器:

一、PyMySQL:
1、登录验证
  写sql语句的时候, %传值的时候, 需要加引号:
    sql = "select * from t4 where name = '%s' and pwd = '%s'" % (username, pwd)
  上面的sql语句带来的风险是:
    Eg1:
      username = zekai' #
      select * from t4 where name = 'zekai' #' and pwd = ''
    Eg2:
      username = dbsahvbdsha' or 1=1 #
      select * from t4 where name = 'dbsahvbdsha' or 1=1

    上面出现的问题,我们称之为 SQL注入
      出现问题的根源是:
        因为太过于相信用户的输入, 导致我们在接受用户输入的参数的时候, 并没有对他进行转义
      解决SQL注入:
        1)自己手工对用户输入的数据进行转义、判断
        2)使用execute()自动进行过滤
           Eg: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 (写)
  1、简单的存储过程:
    delimiter //
    create procedure p1()
    BEGIN
      select * from t11;
    END //
    delimiter ;
    程序:
    call p1();  
  2、传参数: (in)
    delimiter //
    create procedure p2(
    in n1 int,
    in n2 int
    )
    BEGIN
    select * from t11 where id > n1;
    END //
    delimiter ;
    程序:
    call p2(12, 2) 
  3、传入参数: (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 ;
        

猜你喜欢

转载自www.cnblogs.com/Chinesehan/p/11037764.html