关于pymysql读取不到后台数据库更新的数据

今天做一个监控后台数据库数据的程序中,使用了pymysql,但是在每次使用游标对象select对象时数据都是一个样。

原因在于:1. Mysql的存储引擎InooDB的事务隔离级别默认是 可重复读(Repeatable Read),例如A客户端事务未提交,而B客户端事务修改了数据,A客户端只能读取到小于等于当前事务版本号的数据(快照读),所以只有提交完事务后,开启新的事务中才能读取到新的数据。
                  2. PyMysql模块的连接对象默认是没有自动提交事务的,需要我们用一个commite()方法才能提交,不像我们在MySQL客户端中,每次select,update,delete都帮我们自动提交事务,所以只要我们手动提交了事务,再重新select就可以查到新的数据。

解决方法:

             方法一: 每次在用游标对象执行完查询语句后都手动提交
             from pymysql import *
             con = connect(host = ‘xxxx’, port = xxxx, database = ‘xxxx’, user = 'root', password = '123123', charset = 'utf8')
             cs = con.cursor()
             sql = ‘select * from xxx where id = 1’
             # 开启事务
             cs.execute(sql)
             # 手动关闭事务
             con.commit()
             print(cs.fetchone())   #数据a
             # 再开启事务
             cs.execute(sql)
             # 再关闭事务
             con.commit()
             print(cs.fetchone())   #更新后的数据

            方法二.创建一个自动帮我们提交事务的连接对象
            con = connect(host = 'localhost', port = 3306, database = 'smarthome', user = 'root', password = '123123', charset = 'utf8’,  autocommit = 1)    
             这样就不用每次查数据都手动结束事务
             但是修改数据要小心,因为自动提交,没有commit也会生效。

 

 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值