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

时间:2018-05-30 13:20:26

标签: python mysql mqtt

我使用python订阅一个主题,解析JSON并将它们存储在数据库中。我在与MySQL失去联系方面遇到了问题,因为它无法打开太长时间。我收到的消息在

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

我设法通过增加超时来删除它,但这不是一个好的解决方案,因为我不知道系统需要多长时间才能等待消息。 是否有可能仅在收到消息时才能创建连接?

我试图将连接细节添加到消息中,然后关闭它但我仍然遇到同样的问题

def on_message(client, userdata, msg):

sql =""" INSERT INTO data(something)VALUES(%s)"""     data =("某些值")     与db:         尝试:             cursor.execute(SQL,数据)         除了MySQLdb.Error:             db.ping(真)             cursor.execute(SQL,数据)         除了:             打印("错误&#34)             打印(cursor._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")

所以如你所见,我在乞讨时创建了一个与mysql的连接,如果时间没有消息,那么定义的超时我的脚本就会停止工作。

1 个答案:

答案 0 :(得分:1)

尝试:

cur = db.cursor()
try:
    cur.execute(query, params)
except MySQLdb.Error:
    db.ping(True)
    cur.execute(query, params)

db.ping(True)表示重新连接到DB是连接丢失了。您也可以在db.ping(True)之后立即致电MySQLdb.connect。但为了安全起见,我最好将execute()打包到try并在db.ping(True)块中调用except