RPi+DHT22温湿度监测Python代码:MySQL变量插入失败求助
解决树莓派DHT22数据插入MySQL的变量引用问题
嘿,我之前用树莓派搭DHT22温湿度监测系统的时候,也踩过MySQL插入变量的坑!你说的只能插纯字符串、变量插不进去的问题,大概率是直接把变量硬拼进SQL语句里了——要么是数据类型处理不对,要么没用到安全的参数化查询方式。
最安全且不易出错的方法:参数化查询
MySQLdb支持用%s作为占位符的参数化查询,它会自动处理不同数据类型的格式(比如数字不用加引号,字符串自动加),还能避免SQL注入风险,这是首选方案。
给你改好的完整代码示例:
import time import MySQLdb time.sleep(2) # 模拟传感器采集到的数据 temperature = 60.0 humidity = 30.0 IP_Add = "123.456.78.9" location = "basem" # 替换成你的数据库连接信息 db = MySQLdb.connect( host="你的数据库IP", user="数据库用户名", passwd="数据库密码", db="要写入的数据库名" ) # 创建游标对象 cursor = db.cursor() # 用%s作为占位符,对应后面的变量顺序 insert_sql = """INSERT INTO 你的表名 (temperature, humidity, ip_address, location) VALUES (%s, %s, %s, %s)""" try: # 把变量放进元组,传给execute方法 cursor.execute(insert_sql, (temperature, humidity, IP_Add, location)) # 关键!一定要提交事务,否则数据不会真正写入数据库 db.commit() print("温湿度数据成功写入数据库") except Exception as e: # 出错时回滚事务,避免脏数据 db.rollback() print(f"插入失败,错误信息:{str(e)}") # 用完记得关闭游标和连接 cursor.close() db.close()
你可能犯的常见错误(不推荐的写法)
如果你之前是直接拼接字符串,比如这样:
# 错误示例!不要这么写 insert_sql = "INSERT INTO 表名 VALUES (" + str(temperature) + ", '" + humidity + "')"
这种写法不仅容易因为数据类型拼接报错(比如数字转字符串的问题),如果location这类字符串变量里包含单引号,直接就会导致SQL语法错误,还存在SQL注入的安全隐患。
额外注意事项
- 确保你的MySQL表字段类型和变量匹配:比如
temperature是浮点数,表对应字段要设为DECIMAL(5,2)或FLOAT;IP_Add和location设为VARCHAR(50)这类字符串类型。 - 运行代码前,确认树莓派能正常连接到MySQL服务器(防火墙、权限都要设置好)。
- 用
try-except捕获异常,方便快速定位问题(比如字段名写错、数据库连接失败等)。
内容的提问来源于stack exchange,提问作者Tom Fitzsimons
相关产品推荐
相关产品推荐

