今天我们说了一个pymysql
比如写一个登陆验证:
写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))
#插入多条
data=[
('hduqiw' , 'djajie'),
('deuyfcj' , 'dequcj'),
('dguyajc' , 'dqwd')
]
cursor.executemany(sql,data)
try:
cursor.execute(sql,('lxxx' , '123'))
那么删除和更新的时候,需要实物提交
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 &#61;&#61;&#61; > 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 &#61; 1;
END //
delimiter ;
set &#64;v2&#61;123212;
call p3(12, &#64;v2);
select &#64;v2;
触发器:
向用户表中添加一条数据的同时, 在日志表中也添加一条记录
delimiter //
CREATE TRIGGER t1 BEFORE INSERT ON t7 FOR EACH ROW
BEGIN
insert into t11 (name, money) values (&#39;xxx&#39;, 1234);
END //
delimiter ;
’