Как вставить значения в таблицу sql, используя python3? - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь настроить клиент MQTT, используя библиотеку Paho. С этим проблем нет, но я пытаюсь вставить полученные публикации в базу данных 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))

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Здесь:

"""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» фактически должны быть одним и тем же. И, конечно, у вас должны быть математические ключи для всех заполнителей запроса.

1 голос
/ 18 февраля 2020

Ваша полезная нагрузка имеет 6 ключей, а затем вы добавляете еще 2, что делает его 8 В вашем запросе у вас есть только 7 аргументов, я не уверен, но я думаю, что вы забыли добавить «Средняя влажность». РЕДАКТИРОВАТЬ: После просмотра таблицы DES C

    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)
...