今天上午在尝试使用Python中的pymysql模块来进行数据库的insert操作,但每次代码返回已经更新成功,可数据库中就是没有出现相应的数据,一直没有找到错误的原因,很郁闷。后来在网上到处搜索,总算有了一点头绪,在此记录下来。
首先贴上我的代码:
import pymysql
conn = pymysql.connect(host="*.*.*.*",port=***,user="***",passwd="***",db="***")
sql = "insert into dangdang(title,link,comment) values('aaa','bbb','ccc')"
res = conn.query(sql)
print(res)
执行过上述代码以后,程序输出1,说明插入操作已经成功,可是我在数据库里查看,却发现根本没有我想要插入的这行数据,经过一番google,我发现原因如下:
上述问题与MySQL的存储引擎对事务的支持有关,MySQL中有多种类型的存储引擎, 例如: MyISAM, InnoDB等。 MyISAM不支持事务处理, 而InnoDB是事务型数据库, 支持事务。 我的MySQL的默认存储引擎就是InnoDB, 所以对数据库数据的操作会在事先分配的缓存中进行, 只有在commit之后, 数据库的数据才会改变。而python 操作mysql 是用事务的方式来实现的,所以在update的时候必须有commit 提交的过程,否则数据表不会生效(但之前用C或JAVA执行数据库update操作时却不用commit,Python必须要,至于具体原因有懂得的大神麻烦给我解释一下)
解决办法:
方法一:每次操作后必须提交事务(commit),否则操作无效,更改后的代码如下:
import pymysql
conn = pymysql.connect(host="****",port=****,user="****",passwd="****",db="****")
sql = "insert into dangdang(title,link,comment) values('aaa','bbb','ccc')"
res = conn.query(sql)
#对操作进行提交
conn.commit()
print(res)
方法二:数据库连接建立之后,设置自动提交,即如:conn.autocommit(1) ,更改后的代码如下:
import pymysql
conn = pymysql.connect(host="****",port=****,user="****",passwd="****",db="****")
#设置自动提交
conn.autocommit(1)
sql = "insert into dangdang(title,link,comment) values('aaa','bbb','ccc')"
res = conn.query(sql)
conn.commit
print(res)
使用以上任一方法,再去执行update操作,即可成功。