gpt4 book ai didi

Python MySql 查询默默失败

转载 作者:行者123 更新时间:2023-11-29 21:09:45 25 4
gpt4 key购买 nike

我有一个 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错误。但是,如果我等待大约 5 分钟,该错误就会消失,我可以运行 REPLACE INTO再次查询MySql数据库。

发生什么事了?我该如何修复这个错误?

最佳答案

事实证明,autocommit默认为false,关闭游标而不关闭连接将使事务保持打开状态。我将方法更改为:

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

问题就解决了。

关于Python MySql 查询默默失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36485580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com