python mysqldb插入数据蒸发无误

时间:2016-05-31 21:21:03

标签: python mysql

第一篇文章;我被其他人的问题多次帮助过,但现在我完全陷入了困境。

我在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。

查询不会产生错误,但是当我检查表中插入的数据时,它不存在。

  1. 自动提交已开启;直接调用commit()没有效果
  2. 验证了连接用户有权插入表格
  3. 查询出现在系统mysql.log
  4. 这是我能想到的所有内容。我找到的所有答案都是通过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)
    

    感谢您对此有所了解。

1 个答案:

答案 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和你的人真的过着幸福的生活。