python连接mysql sql注入问题 事务

发布时间 2023-09-14 19:02:05作者: Lubomierz
1. pycharm连接MySQL 
import pymysql

# 1. 连接MySQL服务端
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    passwd='123456',
    db='db3',
    charset='utf8',
    autocommit=True
)

# 2. 获取游标
cursor = conn.cursor(pymysql.cursors.DictCursor)

# 3. 执行sql语句 # 进行sql的增删改查
sql = 'select * from emp;'
sql = "insert into emp (name, sex, age, dep_id, gender) values('aa', 'male', 10, 1, 0)"
# 4. 开始执行 affect_rows = cursor.execute(sql) # 影响的行数 print(affect_rows) conn.commit() # 增删改的时候需要二次提交、 查就不需要 # 5. 获得具体数据 for i in cursor.fetchall(): print(i) # print(cursor.fetchmany(3)) # 这个参数代表获取几条数据

 2. 视图

视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可
如果要频繁使用一张虚拟表,可以不用重复查询

如何创建视图
create view teacher2course as
select * from teacher inner join course on teacher.tid = course.teacher_id;
"""
创建好了之后 验证它的存在navicat验证 cmd终端验证
最后文件验证 得出下面的结论 视图只有表结构数据还是来源于之前的表
delete from teacher2course where id=1;
"""
1、在硬盘中,视图只有表结构文件,没有表数据文件

2、视图通常是用于查询,尽量不要修改视图中的数据

删除视图
drop view teacher2course;

3 .事务

1. 什么是事务?
开启一个事务可以包含一些sql语句,这些sql语句要么同时成功
要么一个都别想成功,称之为事务的原子性

事务的作用:
保证了对数据操作的'数据安全性'

案例:用交行的卡操作建行ATM机给工商的账户转钱

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。

原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。

一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

如何用事务?
# 先介绍事务的三个关键字 再去用表实际展示效果

start transaction;  # 开启事务
...    #  需要执行的操作

commit; # 二次确认提交 一但二次确认 就是永久性的
rollback; # 回滚  回到最初的状态 

sql展示“
create table user(
id int primary key auto_increment,
name char(32),
balance int
);

insert into user(name,balance)
values
('jason',1000),
('egon',1000),
('tank',1000);

# 修改数据之前先开启事务操作
start transaction;

# 修改操作
update user set balance=900 where name='jason'; #买支付100元
update user set balance=1010 where name='egon'; #中介拿走10元
update user set balance=1090 where name='tank'; #卖家拿到90元

# 回滚到上一个状态
rollback;

# 开启事务之后,只要没有执行commit操作,数据其实都没有真正刷新到硬盘
commit;
"""开启事务检测操作是否完整,不完整主动回滚到上一个状态,如果完整就应该执行commit操作"""

# 站在python代码的角度,应该实现的伪代码逻辑,
try:
    update user set balance=900 where name='jason'; #买支付100元
    update user set balance=1010 where name='egon'; #中介拿走10元
    update user set balance=1090 where name='tank'; #卖家拿到90元
except 异常:
    rollback;
else:
    commit;

# 那如何检测异常?
# 事务要尽量少的开
# 不要写一个SQL语句都写到事务里面去

4. 隔离级别

读未提交(Read Uncommitted):事务中的修改可以被其他事务读取,即一个事务可以读取到另一个未提交事务修改的数据。
简而言之:一个事务可以读到其他事务修改了但未提交的数据。

读已提交(Read Committed):事务只能读取已经提交的数据,不能读取未提交的数据。在该隔离级别下,事务只能读取到已经提交的数据,因此会避免脏读的情况。(脏读的概念可以参考本栏其他博客)
简而言之:数据的读取只能读取已经提交过的数据,和读未提交相比,读未提交可以读取修改了单位提交的数据。而读已提交则不行,因此避免了脏读的情况。

可重复读(Repeatable Read):在一个事务中多次读取同一个数据时,能够保证读取到的数据一致,即使其他事务修改了该数据。在隔离级别下,事务在读取数据时会锁定该数据,其他事务不能修改该数据,因此可以避免脏读和不可重复读的情况。
本人理解:应该用锁将写操作锁定,可以重复读取且数据保持一致。

串行化(Serializable,序列化):最高的隔离级别,它保证所有事务之间的执行顺序按照某个顺序执行,避免了所有并发问题。在该隔离级别下,事务之间互相等待,直到前一个事务执行完成后才能执行下一个事务,因此可以避免脏读、不可重复读和幻读的情况。
将事务串行化,一次只能按照特定顺序执行一个事务,因为只执行一个事务,会避免很多问题,但是肯定会降低执行效率。
  • 脏读 :一个事务读取到另一个事务还没有提交的数据

  • 不可重复读 :在一个事务中多次读取同一个数据时,结果出现不一致

  • 幻读 :在一个事务中,使用相同的 SQL 两次读取,第二次读取到其他事务新插入的行