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 两次读取,第二次读取到其他事务新插入的行
标签:事务,读取,python,mysql,提交,sql,数据,name From: https://www.cnblogs.com/lchengshao/p/17700653.html