坑:
查询数据库 -> 修改数据库内容 -> 再次查询数据库,会发现两次查询结果一样,修改的内容未被查询出来
import MySQLdb conn = MySQLdb.connect( host='192.168.1.101', port=3306, user='123', passwd='123', db='test', charset='utf8' ) cur1 = conn.cursor() sql1 = "select id from user" cur1.execute(sql1) nn = cur1.fetchall() # 111 print(nn) cur1.close() # ---修改数据库中id的值为222--- cur2 = conn.cursor() sql2 = "select id from user" cur2.execute(sql2) mm = cur2.fetchall() # 111 print(mm) cur2.close() conn.close()
这是因为python的Mysqldb默认关闭autocommit,任意执行一个select子句,对于Mysql5.5以上版本,都会造成MATADATA LOCK阻塞
第一次查询后,产生阻塞,所以后续不能查询到最新数据
解决方法:
python的MySQLdb的API把数据库更新语句做为事务来执行,这样的话,虽然使用execute语句执行了sql,但是并没有真的对数据库进行改变,除非使用commit方法来显式的提交事务才可以对数据库造成影响,否则,数据库会自动回滚。所以解决方案:增加commit,有三种方式可选:
方式一:在连接数据库时,设置自动commit
conn = MySQLdb.connect( host='192.168.1.101', port=3306, user='123', passwd='123', db='test', charset='utf8', autocommit='True' )
方式二:在查询之前,设置自动commit
conn.autocommit('True')
方式三:在第一次查询结束后,增加以下一句,手动commit:
conn.commit()
ps:
此坑只存在于mysql引擎是InnoDB的情况下
如果你的mysql引擎是Myisam,则只要调用execute就会提交事务