好。我在这里构建了一个mysql查询浏览器,比如navicat。使用MySQLdb执行查询。
这是奇怪的部分。当我通过程序运行查询(使用MySQLdb)时,它给了我成功,受影响的行= 1,但是当我在phpmyadmin中查看它时,值没有改变。
所以在我执行查询之前,我将其打印出来,复制并粘贴到phpmyadmin的查询窗口中,点击go即可。长话短说,更新查询不起作用,但是当我复制并粘贴到phpmyadmin时,它可以工作。
self.tbl.sql.use(self.tbl.database) # switches to correct database. I've printed this and it uses the corrected db
if self.tbl.sql.execute(query) == True:
print sql_obj.rows_affected() # returns 1 (since i only do 1 query)
这是SQL类的一部分
def execute(self, query):
try:
self.cursor.execute(query)
return True
except MySQLdb.ProgrammingError as error:
print "---->SQL Error: %s" % error
return False
except MySQLdb.IntegrityError as e:
print "--->SQL Error: %s" % e
return False
所有想法可能会发生什么?
答案 0 :(得分:19)
我相信@Jason Creighton和@ S.Lott是正确的。
至少如果您要更新的表位于事务存储引擎上。 InnoDB
是交易性的,ISAM
不是。
您必须在关闭连接对象之前调用commit()
,或者必须将连接设置为自动提交模式。我不确定你是如何为MySQLdb连接做的那样,我猜你要么为连接构造函数设置一个参数,要么在创建连接对象后设置一个属性。
类似的东西:
conn = mysql.connection(host, port, autocommit=True)
# or
conn = mysql.connection(host, port)
conn.autocommit(True)
答案 1 :(得分:16)
只是猜测:Python中的代码可能在事务中运行,而事务可能需要显式提交?
编辑:可能有一个entry in the MySQLdb FAQ。