day-44mysql

时间:2019-06-16
本文章向大家介绍day-44mysql,主要包括day-44mysql使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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注入

出现问题的根源是:
    因为太过于相信用户的输入, 导致我们在接受用户输入的参数的时候, 并没有对他进行转义
解决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 ;
        

原文地址:https://www.cnblogs.com/klw1/p/11032644.html