Python MySql查询无声地失败

时间:2016-04-07 19:35:04

标签: python mysql

我有一个MySql数据库(使用库存Docker镜像运行),它包含一个如下定义的表:

CREATE TABLE `Edits` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `context` varchar(255) NOT NULL,
  `field` varchar(255) NOT NULL,
  `value` text,
  `username` varchar(255) DEFAULT NULL,
  `requested` datetime DEFAULT NULL,
  PRIMARY KEY (`id`,`context`,`field`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=latin1

我在WSGI应用程序中连接它,我的连接代码如下所示:

import contextlib
import MySQLdb

mysql = MySQLdb.connect(host = 'host', db = 'db')

def _cursor():
  mysql.ping(True)
  return contextlib.closing(mysql.cursor())

def _exec(sql, params = None):
  with _cursor() as c:
    c.execute(sql, params)

def save_edits(id, context, field, value, username):
  return _exec('REPLACE INTO Edits SET id = %(id)s, context = %(context)s, 
    field = %(field)s, value = %(value)s, username = %(username)s, 
    requested = UTC_TIMESTAMP()', {
      'id': id,
      'context': context,
      'field': field,
      'value': value,
      'username': username,
  })

当我调用save_edits函数时,它不会抛出异常,但无法更新数据库。此外,尝试通过REPLACE INTO Edits SET id = 1, context = 'x', field = 'y', value = 'z', username = 'foo', requested = UTC_TIMESTAMP(); shell运行查询mysql失败,并显示ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction错误。但是,如果我等待大约5分钟,则该错误消失,我可以再次对MySql数据库运行REPLACE INTO查询。

发生了什么事?我该如何解决这个错误?

1 个答案:

答案 0 :(得分:0)

默认情况下autocommitfalse,关闭游标而不关闭连接会使事务保持打开状态。我把方法改为:

def _exec(sql, params = None):
  with _cursor() as c:
    c.execute(sql, params)
    mysql.commit()

这解决了这个问题。