在python中接收到mqtt消息后如何重新连接mysql?

u1ehiz5o  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(390)

我使用python订阅一个主题,解析json并将它们存储在数据库中。我有问题,失去与mysql的连接,因为它不能打开太久。我收到的信息如下

_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')

我设法通过增加超时来删除它,但这不是一个好的解决方案,因为我不知道系统需要等待消息多长时间。有没有可能我只能在收到消息时创建连接?
我试图将连接详细信息添加到on消息中,然后关闭它,但仍然存在相同的问题

def on_message(client, userdata, msg):

sql=“”insert into data(something)values(%s)“”data=(“something value”)with db:try:cursor.execute(sql,data)except mysqldb.error:db.ping(true)cursor.execute(sql,data)except:print(“error”)print(cursor.\u last executed)
但是这个变量在这个函数之外是不可见的。这方面的最佳做法是什么。
建立连接的代码部分如下

import paho.mqtt.client as mqtt
import MySQLdb
import json
import time

# mysql config

try:
    db = MySQLdb.connect(host="localhost",  # your host 
                     user="admin",       # username
                     passwd="somepass",     # password
                     db="mydb")   # name of the database
except:
    print("error")

如您所见,我已经在begging创建了一个到mysql的连接,如果在指定的超时时间内没有消息,我的脚本将停止工作。

pxyaymoc

pxyaymoc1#

尝试:

cur = db.cursor()
try:
    cur.execute(query, params)
except MySQLdb.Error:
    db.ping(True)
    cur.execute(query, params)
``` `db.ping(True)` 说重新连接数据库是因为连接丢失了。你也可以打电话 `db.ping(True)` 刚好在…之后 `MySQLdb.connect` . 但为了安全起见,我最好还是包起来 `execute()` 进入 `try` 打电话给我 `db.ping(True)` 在 `except` 阻止。

相关问题