[英]Python MySql query silently failing
我有一个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();
之后通过mysql
shell失败,并显示ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
错误。 但是,如果我等待5分钟左右,该错误就会消失,我可以再次对MySql数据库运行REPLACE INTO
查询。
这是怎么回事? 如何解决此错误?
事实证明默认情况下autocommit
为false
,关闭游标而不关闭连接将使事务保持打开状态。 我将方法更改为:
def _exec(sql, params = None):
with _cursor() as c:
c.execute(sql, params)
mysql.commit()
这就解决了问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.