Python输出未显示在MySQL中,无法向temp-at-interrupt表插入数据
解决Python向MySQL插入温度数据失败的问题
嘿,作为刚接触Python和MySQL的初学者,遇到插入数据不显示的问题太正常啦!我帮你梳理几个最容易踩的坑,一步步排查就能解决你的两个问题——数据没在MySQL显示、无法插入数据。
1. 先确保数据库连接没问题
很多时候插入失败是因为连接参数错了,但你可能没察觉到。先给你的连接代码加上异常捕获,这样能明确知道哪里出问题:
try: conn = mysql.connector.connect( host='localhost', # 改成你的MySQL主机,本地一般是localhost user='你的用户名', password='你的密码', database='你的数据库名' # 要确保这个库存在且你有权限访问 ) cursor = conn.cursor() print("数据库连接成功!") except mysql.connector.Error as err: if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: print("用户名或密码错啦!") elif err.errno == errorcode.ER_BAD_DB_ERROR: print("对应的数据库不存在哦!") else: print(f"其他数据库错误:{err}")
2. 检查SQL插入语句的语法
你的表名是temp-at-interrupt,中间有横杠,MySQL会把它当成减法运算,这绝对会报错!还有TIME、DATE是MySQL的关键字,也需要用反引号包裹起来。正确的插入语句应该是这样:
# 注意表名和关键字字段的反引号 insert_query = """ INSERT INTO `temp-at-interrupt` (`TIME`, `DATE`, `TEMPERATURE`) VALUES (%s, %s, %s) """
这里用%s做参数占位符,不要直接把变量拼进字符串里——既容易出错,还会有SQL注入风险。
3. 千万别忘了提交事务!
这是初学者最容易忽略的点!MySQL默认是关闭自动提交的,你执行完插入语句后,数据只是存在内存里,并没有真正写入数据库。必须调用conn.commit()才能把数据持久化:
# 执行插入语句后立刻提交 cursor.execute(insert_query, (current_time, current_date, temperature)) conn.commit() # 这行绝对不能少!
如果插入过程中出错,还可以用conn.rollback()回滚,避免脏数据。
4. 确保数据类型和表结构匹配
你得先确认temp-at-interrupt表的字段类型:
- 如果
TIME字段是MySQL的TIME类型,那你传入的时间字符串得是HH:MM:SS格式; DATE字段是DATE类型的话,字符串得是YYYY-MM-DD格式;TEMPERATURE如果是数字类型(比如FLOAT或DECIMAL),要确保你传入的是float/int类型,不是字符串。
比如你用strftime('%H:%M:%S')生成时间,strftime('%Y-%m-%d')生成日期,就刚好匹配对应的字段类型。
5. 验证数据是否真的插入了
有时候不是没插入,而是你查询的时候找错了表或者数据库。插入后可以立刻查询最新的一条记录,确认是否成功:
cursor.execute("SELECT * FROM `temp-at-interrupt` ORDER BY `DATE` DESC, `TIME` DESC LIMIT 1") latest_record = cursor.fetchone() if latest_record: print("刚插入的数据已经在数据库里啦:", latest_record) else: print("还是没找到数据,那得再检查前面的步骤哦")
完整的示例代码框架
把这些点整合起来,结合你的传感器读取逻辑,给你一个完整的参考(你只需要补全温度读取的部分就行):
import os import time import datetime import glob import mysql.connector from mysql.connector import errorcode from time import strftime # 初始化传感器(你的原代码部分) os.system('modprobe w1-gpio') os.system('modprobe w1-therm') base_dir = '/sys/bus/w1/devices/' # 补全你的温度读取函数 def read_temperature(): # 这里写你读取DS18B20温度的逻辑,比如找到传感器文件、解析温度值 # 示例返回一个温度值,你替换成自己的代码就行 return 26.3 # 插入数据到数据库的函数 def insert_temp_to_db(temp): current_time = strftime('%H:%M:%S') current_date = strftime('%Y-%m-%d') conn = None try: # 连接数据库 conn = mysql.connector.connect( host='localhost', user='你的用户名', password='你的密码', database='你的数据库名' ) cursor = conn.cursor() # 插入语句 insert_query = """ INSERT INTO `temp-at-interrupt` (`TIME`, `DATE`, `TEMPERATURE`) VALUES (%s, %s, %s) """ # 执行插入并提交 cursor.execute(insert_query, (current_time, current_date, temp)) conn.commit() print(f"成功插入:日期{current_date},时间{current_time},温度{temp}℃") # 验证插入结果 cursor.execute("SELECT * FROM `temp-at-interrupt` ORDER BY `DATE` DESC, `TIME` DESC LIMIT 1") print("数据库最新记录:", cursor.fetchone()) except mysql.connector.Error as err: print(f"出错啦:{err}") if conn: conn.rollback() # 出错就回滚 finally: # 不管成功失败,都要关闭连接 if conn: cursor.close() conn.close() # 主程序 if __name__ == "__main__": temp = read_temperature() insert_temp_to_db(temp)
按照这些步骤排查,应该就能解决你的问题啦!
内容的提问来源于stack exchange,提问作者Njord Nyström
相关产品推荐
相关产品推荐

