You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python采集DHT22数据存入MariaDB时cur.execute不执行问题求助

问题排查与修复方案
  • 首先修复异常捕获逻辑,你的代码用了裸except语句,会吞掉所有错误信息,完全无法定位失败原因,先修改内部异常捕获代码输出具体报错:
    把原插入部分的代码
try: 
    cur.execute("INSERT INTO messstation (uhrzeit,luftfeuchtigkeit, raumtemperatur) VALUES (?, ?, ?)", (dt_string, temperature_c, humidity)) 
    print("h")
    conn.commit()
except: 
    print("Test")

修改为

try: 
    # 执行前先验证连接是否存活,支持自动重连
    conn.ping(reconnect=True)
    cur.execute("INSERT INTO messstation (uhrzeit,luftfeuchtigkeit, raumtemperatur) VALUES (?, ?, ?)", (dt_string, temperature_c, humidity)) 
    print("h")
    conn.commit()
except Exception as e: 
    print(f"插入失败,错误信息:{e}")

运行修改后的代码即可看到具体报错原因,常见报错对应解决方案如下:

  • 报错提示时间格式不匹配:确认messstation表的uhrzeit字段类型,如果是datetime类型,需要把你当前的时间格式化字符串从"%d/%m/%Y %H:%M:%S"改成MariaDB默认支持的"%Y-%m-%d %H:%M:%S",日/月/年的格式不符合数据库datetime字段的默认解析规则,是这类插入失败的高频原因。
  • 报错提示连接断开/无有效连接:你在循环外提前建立了数据库连接,长时间闲置会被MariaDB自动断开,除了上面添加的conn.ping(reconnect=True)之外,也可以把数据库连接的建立逻辑放到循环内部,每次插入前新建连接、用完关闭,彻底避免闲置断连问题。
  • 报错提示表/字段不存在:确认你连接的messstation库中存在同名表,且字段名拼写和SQL语句中的完全一致,没有拼写错误。

修复后完整代码示例

import time
import board
import adafruit_dht
import mariadb
from datetime import datetime

dhtDevice = adafruit_dht.DHT22(board.D17)
x = 0

while x < 5:
    x = x+1
    time.sleep(2.0)
    try:
        # 读取传感器数据
        temperature_c = dhtDevice.temperature
        humidity = dhtDevice.humidity
        print('Temp', temperature_c)
        print('Humidty:', humidity)
        now = datetime.now()
        # 修改为数据库兼容的时间格式
        dt_string = now.strftime("%Y-%m-%d %H:%M:%S")
        try: 
            # 每次插入前新建连接,避免闲置断开
            conn = mariadb.connect(
                user="root",
                password="password",
                host="localhost",
                database="messstation")
            cur = conn.cursor()
            cur.execute("INSERT INTO messstation (uhrzeit,luftfeuchtigkeit, raumtemperatur) VALUES (?, ?, ?)", (dt_string, temperature_c, humidity)) 
            print("h")
            conn.commit()
            cur.close()
            conn.close()
        except Exception as e:
            print(f"插入失败:{e}")
    except Exception as e:
        print(f"传感器读取失败:{e}")
        pass

内容的提问来源于stack exchange,提问作者Alessandro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:45:05