Moin!
我正在尝试使用paho库建立mqtt客户端。这样就没有问题,但是我试图将收到的发布内容插入sql数据库中。我将收到的有效负载字符串转换为字典,并添加一些条目。执行以下代码时:
def insert_values(db_connection=None, topic=None, payload=None, time_received=None):
query_1 = "SELECT topic_id FROM topics WHERE topic = %s"
query_2 = """INSERT INTO measurements (start_time, end_time, value, max_value, min_value, time_received, topic_id)
VALUES (%(start_time)s, %(end_time)s, %(value)s, %(max_value)s, %(min_value)s, %(time_received)s,
%(topic_id)s)"""
cursor = db_connection.cursor(prepared=True)
topic_id = cursor.execute(query_1, topic)
payload["time_received"] = time_received
payload["topic_id"] = topic_id
cursor.executemany(query_2, payload)
db_connection.commit()
db_disconnect(db_connection, cursor)
我收到以下错误:
Caught exception in on_message: 1210: Incorrect number of arguments executing prepared statement
负载看起来像这样:
payload = {
"Starttime:": 2020-02-18 10:11:22.2145563,
"Endtime:": 2020-02-18 10:12:22.2145563,
"Average Humidity:": 44.256241,
"Number of Values:": 22,
"Max Humidity:": 44.586214,
"Min Humidity:": 44.012148521)
}
加上一些其他信息,例如接收有效负载的时间。在insert_values方法中,我试图从表主题中获取topic_id并将其写入有效负载。
感谢您的提示!
编辑:要在其中写入测量值的表如下所示:
CREATE TABLE IF NOT EXISTS measurements
(measurement_id INT AUTO_INCREMENT,
start_time DATETIME,
end_time DATETIME,
value FLOAT,
max_value FLOAT,
min_value FLOAT,
time_received DATETIME,
topic_id INT,
PRIMARY KEY (measurement_id),
FOREIGN KEY (topic_id) REFERENCES topics(topic_id))
您的有效负载有6个键,然后再添加2个键,使其成为8您的查询中只有7个参数我不确定,但我认为您忘记添加“平均湿度”编辑:看到您的表DESC
query_2 = """INSERT INTO measurements (start_time, end_time, value, max_value, min_value, time_received, topic_id)
VALUES (%s,%s,%s,%s,%s,%s,%s)"""
cursor = db_connection.cursor(prepared=True)
topic_id = cursor.execute(query_1, topic)
payload["time_received"] = time_received
payload["topic_id"] = topic_id
payload.pop("Average Humidity:", None)
cursor.executemany(query_2, payload)
db_connection.commit()
db_disconnect(db_connection, cursor)
这里:
"""VALUES (%(start_time)s, %(end_time)s, %(value)s, %(max_value)s, %(min_value)s, %(time_received)s, %(topic_id)s)"""
和这里:
payload = {
"Starttime:": 2020-02-18 10:11:22.2145563,
"Endtime:": 2020-02-18 10:12:22.2145563,
"Average Humidity:": 44.256241,
"Number of Values:": 22,
"Max Humidity:": 44.586214,
"Min Humidity:": 44.012148521)
}
您的payload
键必须与查询的占位符名称匹配-或您的占位符与payload
键匹配。您的数据库客户端肯定不会尝试猜测“ start_time”和“ Starttime”实际上是同一回事。当然,您必须具有all查询占位符的数学键。