【问题标题】:How do I insert values into a sql table using python3?如何使用 python3 将值插入到 sql 表中?
【发布时间】:2020-02-18 10:17:16
【问题描述】:

我正在尝试使用 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))

【问题讨论】:

    标签: sql python-3.x mqtt paho


    【解决方案1】:

    您的有效负载有 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)
    

    【讨论】:

    • 是的,我忽略了 mesurement_id,因为它是表 mesurements 的 auto_increment 主键。我认为它会自动为每个条目添加一个新 id
    • 你能发布你的测量表的描述吗?
    • 我尝试了您更正的查询,但我得到了同样的错误
    • 谢谢,但如果我弹出平均湿度,我会丢失我想在数据库中写入的关键值之一。这是我正在做的一个小型物联网项目,我需要将所有有效载荷的值写入数据库。该列称为值,因为稍后我可能需要将湿度以外的值写入表中。
    • 您的测量表有 7 个字段,添加 time_received 后的有效负载,topic_id 有 8 个字段,这就是您收到错误的原因。如果要添加有效负载的所有键,则必须向表中添加另一个字段,否则必须从有效负载中删除一个键
    【解决方案2】:

    这里:

    """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 查询占位符的数学键。

    【讨论】:

    • 我使用表中使用的键更正了有效负载。现在它陷入了一个执行。 Caught exception in on_message: 'start_time'你知道这个错误,你能告诉我出了什么问题吗?它仍然没有将有效负载的值写入表中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 2021-02-17
    • 1970-01-01
    • 2011-09-17
    相关资源
    最近更新 更多