运行下面的这段Python代码,却总是无法更新数据:
import pymysql
conn=pymysql.connect(
host = '127.0.0.1', user = 'yewen', passwd='YeWen.3306',
port= 3306, db='test', charset='utf8mb4')
cur = conn.cursor()
sql = "update t1 set c3 = rand()*10240 where c1 = rand()*1024"
cur.execute(sql)
cur.close()
conn.close()
而运行下面的这段看起来一样的代码,却可以正常删表:
import pymysql
conn=pymysql.connect(
host = '127.0.0.1', user = 'yewen', passwd='YeWen.3306',
port= 3306, db='test', charset='utf8mb4')
cur = conn.cursor()
sql = "drop table tmp1"
cur.execute(sql)
cur.close()
conn.close()
其实问题并不复杂,有几个原因:
知道上面的原因就好办了。我们先看下pymysql源码中关于自动提交的设定:
[root@yejr-mgr1 pymysql]# cat /usr/lib/python2.7/site-packages/pymysql/connections.py
...
#约158行附近
158 :param autocommit: Autocommit mode. None means use server default. (default: False)
...
所以,解决方法有好几种:
1. 在连接初始化时开启自动提交模式,例如:
#设置属性autocommit=1亦可
conn=pymysql.connect(
host = '127.0.0.1', user = 'yewen', passwd='YeWen.3306',
port= 3306, db='test', charset='utf8mb4', autocommit=True)
2. 或者执行完DML操作后,再执行一次commit请求,例如:
sql = "update t1 ...
cur.execute(sql)
cur.execute("commit")
3. 又或者在创建完连接后,修改autocommit模式,例如:
conn=pymysql.connect(
host = '127.0.0.1', user = 'yewen', passwd='YeWen.3306',
port= 3306, db='test', charset='utf8mb4')
cur = conn.cursor()
cur.execute("set autocommit=1")
到这里,自动提交的问题解决了。
但还要更进一步,开启或关闭autocommit有什么利弊呢?简言之,有几点建议:
set autocommit=0
,更有甚者,每次执行一个SQL前,都要发送一次set请求,增加了无谓的开销,如果有这种情况,可以自行调整开发框架的代码。Enjoy MySQL :)