主模块和线程之间共享mysql连接,导致数据结果不匹配



这是我的MySQL类在多个需要SQL连接的其他类之间共享:

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)

对象在Main模块

中创建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连接一次只能有一个游标——一个活动查询。但是连接不是很昂贵,所以您可以为每个需要并发运行的查询使用单独的连接。

问题是在Threads中共享main模块中创建的mysql对象。在Threading函数中重用mysql对象会产生意想不到的mysql结果。现在每次我开始新的线程,我首先创建新的mysql连接对象,这是在目标线程中使用。看来,问题已经完全消失了,但这是正确的方式处理mysql连接的线程吗?