python - 在主模块和线程之间共享mysql连接导致数据结果不匹配
问题描述
这是我在需要 SQL 连接的多个其他类之间共享的 MySQL 类:
class mysqlAssist():
def __init__(self):
self.con = MySQLdb.connect("localhost","user","pass","DB",3306, charset="utf8")
self.con.autocommit(True)
@contextmanager
def cursor(self, *args, **kwargs):
c = self.con.cursor( *args, **kwargs)
try:
yield c
finally:
c.close()
def fetchOne(self, _sql):
with self.cursor() as c:
try:
c.execute(_sql)
return c.fetchone()
except (MySQLdb.Error, MySQLdb.Warning) as e:
print(e)
def fetchAll(self, _sql):
with self.cursor( MySQLdb.cursors.DictCursor ) as c:
try:
c.execute(_sql)
return c.fetchall()
except (MySQLdb.Error, MySQLdb.Warning) as e:
print(e)
该对象在主模块中创建
mysql_assist = mysqlAssist();
我的主模块执行以下两个 SQL 查询:
mysql_assist.fetchOne:
SELECT `start_time`, `stop_time`, `AHC_DAY` FROM `_management` WHERE `_active` = '1'
mysql_assist.fetchAll:
SELECT _id, _desc, _show_type, _web_manage, _lastevent, _lastevent=max_lastevent
AS _latest FROM `_setup` CROSS JOIN (SELECT MAX(_lastevent) as max_lastevent FROM _setup) m
第二个查询结果如下所示:
+---------+-------------------+----------------+-----------------+----------------+-------------+
| _id | _desc | _show_type | _web_manage | _lastevent | _latest |
+---------+-------------------+----------------+-----------------+----------------+-------------+
| here>11 | A | 1 | 1 | 1633107217 | 0 |
| 6 | B | 1 | 0 | 1633168302 | 0 |
| 12 | C | 0 | 0 | 1633169804 | 1 |
| 16 | D | 0 | 1 | 1632480486 | 0 |
| 19 | E | 0 | 0 | 1632549333 | 0 |
| 26 | F | 0 | 0 | 1631868026 | 0 |
| 25 | G | 1 | 0 | 1633168303 | 0 |
| 27 | H | 1 | 1 | 1632992896 | 0 |
+---------+-------------------+----------------+-----------------+----------------+-------------+
现在的问题:很少和偶尔,第一个查询以特定值返回第二个查询的结果:11
这是第二个查询的第一行和第一列结果。问题的证据是我的回溯显示以下错误,因为它期望完全不同的结果(日期)然后是纯数字:ERROR - time data '11' does not match format '%H:%M:%S'
,所以这确实不是数据库的预期结果。
当使用先前创建的连接对象作为线程执行第二个查询时,就会发生这种情况mysql_assist
。
在线程中处理 MYSQL 连接的正确方法是什么?
解决方案
MySQL 连接一次只能有一个游标——一个活动查询。但是连接不是很昂贵,因此您可以为需要同时运行的每个查询使用单独的连接。
推荐阅读
- c# - StructureMap 注册单一组件类型,满足多于一种服务
- sql - 在“情况下”中使用列而不包括在 Group By 中 - 或使用分区
- javascript - Laravel 设计。如何显示检索到的标签
- python - 带有圣人(使用python)外壳的aws ec2上的“无法执行二进制文件”
- php - php is_integer 返回 true 到字符串值
- visual-studio-2019 - 如何自定义VS2019 v16生成的app_offline.htm文件
- javascript - 通过蓝牙连接设备
- excel - Excel VBA 仅从自定义函数设置默认值一次
- php - 页面仅显示前端的两个自定义字段之一
- android - 使用 Safeargs 组件通过 BottomNavigationView 传递参数