Данные не сохраняются в mysql с помощью python mysql.connector - PullRequest
1 голос
/ 17 октября 2019

Я подключаюсь к MySQL из своего скрипта на python, подписываюсь на тему от mqtt-брокера, и всякий раз, когда я получаю данные, я сохраняю данные.

код

import mysql.connector
connection = mysql.connector.connect(host='localhost',database='db',user='',
                                   password='',auth_plugin='mysql_native_password')

sql_insert_query = """      #INSERT query
cursor = connection.cursor()

def on_message(client, userdata, message):
    print("message received ")
    msg = json.loads(message.payload.decode("utf-8"))
    #processing of message

    cursor.execute(sql_insert_query,processed_msg)
    connection.commit()
    print('inserted in db')

def on_connect(client, userdata, flags, rc): 
    print("Subscribing to topic","topic")
    client.subscribe("topic")

broker_address=""
port = 8888

client = mqtt.Client(clean_session=True) #create new instance
client.on_connect = on_connect
client.on_message = on_message #attach function to callback

print("connecting to broker")
client.connect(broker_address, port=port) #connect to broker
client.loop_forever() #stop the loop

Так что с этимКод сохраняет данные, когда mqtt получает какое-либо сообщение. Но бывают случаи, когда mqtt не получает данные в течение более 8 часов, а затем снова начинает получать данные. В таких случаях скрипт не сохраняет данные, полученные через 8 часов или около того. Я верю, что происходит какой-то тайм-аут. Потому что когда я снова запускаю скрипт, данные сохраняются в mysql db. Может кто-нибудь помочь мне понять, что это за тайм-аут или как решить эту проблему?

Спасибо

1 Ответ

0 голосов
/ 17 октября 2019

Вы подключаетесь один раз наверху к базе данных, может быть, у подключения есть тайм-аут

Вы подключаетесь к базе данных каждый раз, когда сообщение приходит и закрывается, когда завершено в вашем on_message обратном вызове

Причина: Соединение получило тайм-аут

Вы можете установить тайм-аут на более высокое время с помощью

'SET GLOBAL connect_timeout=86400';
'SET GLOBAL wait_timeout=86400';
'SET GLOBAL interactive_timeout=86400'; 

Или просто вместо этого вы можете сделать это в on_message обратном вызове

def on_message(client, userdata, message):
    connection = mysql.connector.connect(host='localhost',database='db',user='',
    cursor = connection.cursor()                                   
    print("message received ")
    msg = json.loads(message.payload.decode("utf-8"))
    #processing of message

    cursor.execute(sql_insert_query,processed_msg)
    connection.commit()
    cursor.close()
    connection.close()
    print('inserted in db')
...