第一篇文章;我被其他人的问题多次帮助过,但现在我完全陷入了困境。
我在python中工作,使用MySQLdb(在下面导入为'mysql')并尝试插入。此代码与其自己的连接进行隔离以进行调试,使用(在调试之前)相同的连接完全成功插入到同一数据库中的不同表。
import MySQLdb as mysql
from futuremachine import data
j = {};
return_id = 7201;
j['boxids'] = [u'28']
...
local_connection = data.environment('development');
local_db = mysql.connect(**local_connection);
local_curs = local_db.cursor();
if local_db.autocommit:
print "AUTOCOMMIT ON";
else:
print "EUREKA";
# insert the new set of labels
for label_id in j['boxids']:
query = """
insert into eventlabels values (%s, %s)
"""
args = [int(return_id),int(label_id)]
try:
#local_curs.execute(query,args);
data.executive(local_curs,query,args);
#local_db.commit()
except mysql.Error, e:
sys.exit("sql error:\n" + query + "\n%s" % e);
ci = local_db.info()
rc = local_db.affected_rows()
print "info: "+str(ci);
print "affected: "+str(rc);
local_db.close();
'data.executive'是curs.execute的包装器;我已经尝试了这个有和没有包装器相同的结果。 return_id是前一个插入的lastrowid,每次都有效;上面给出了虚拟值。
info()返回None;更令人沮丧的是,affected_rows()返回1。
查询不会产生错误,但是当我检查表中插入的数据时,它不存在。
这是我能想到的所有内容。我找到的所有答案都是通过connection.com()来解决的,到目前为止还没有帮助。
有问题的表格:
mysql> show full columns from eventlabels;
+---------+---------+-----------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+---------+---------+-----------+------+-----+---------+-------+---------------------------------+---------+
| eventid | int(11) | NULL | NO | PRI | NULL | | select,insert,update,references | |
| labelid | int(11) | NULL | NO | PRI | NULL | | select,insert,update,references | |
+---------+---------+-----------+------+-----+---------+-------+---------------------------------+---------+
2 rows in set (0.00 sec)
感谢您对此有所了解。
答案 0 :(得分:2)
我找到了两个部分的答案:
http://laviefrugale.blogspot.com/2011/03/python-and-mysql-autocommit.html
然后引用这个本地答案:
Python's MySqlDB not getting updated row
设置一个远程数据库并没有给我带来任何好处,但事实证明有问题的数据库设置得很奇怪:
mysql> select table_name,engine FROM information_schema.tables
-> WHERE table_schema = DATABASE();
+-------------+--------+
| table_name | engine |
+-------------+--------+
| eventlabels | InnoDB |
| events | MyISAM |
| labels | InnoDB |
+-------------+--------+
3 rows in set (0.02 sec)
上面提到的莫名其妙的行为是autocommit()设置在第一个插入(事件,一个非常古老的MyISAM表)上的结果,但是事件标签忽略了该设置,因为它是InnoDB。 / p>
我无法弄清楚为什么手动提交没有区别,或者测试db.autocommit会产生非EUREKA结果,但最后,为连接明确设置autocommit解决了问题。< / p>
local_db.autocommit(True);
在上下文中:
local_connection = data.environment('development');
local_db = mysql.connect(**local_connection);
local_db.autocommit(True);
local_curs = local_db.cursor();
如果您已经读过这篇文章,希望这对您有所帮助;与此同时,MyISAM,InnoDB和你的人真的过着幸福的生活。