Python中MySQL查询结果值比较失效问题求助
解决Python中MySQL查询结果与温度值比较失效的问题
我帮你排查了下代码里的几个关键问题,这应该就是比较逻辑无法正常工作的原因:
核心问题分析
query()函数没有返回值:你当前的query函数只打印了查询到的温度值,但没有把结果返回给调用它的target变量。这会导致target实际上是None,拿温度数值和None做比较肯定得不到正确结果。- 类型不匹配:你把查询到的
temp转成了字符串类型(nam = str(na)),但从传感器读取的temperature是浮点数。字符串和数值直接比较会触发Python的类型比较逻辑,结果和你预期的数值大小比较完全不同。 - 代码缩进错误:原
query函数里的数据库连接代码缩进不对,会导致函数执行时这部分代码根本没被包含在函数内,可能引发其他潜在问题。
修复后的代码示例
import pymysql import time import RPi.GPIO as GPIO from Adafruit_DHT import readAdafruitDHT # 假设这些变量已经定义过 host = "你的数据库地址" user = "用户名" pass1 = "密码" database = "数据库名" sens = "传感器ID" logf = open("log.txt", "a") # 示例日志文件 def query(): # 修正缩进:数据库连接代码要放在函数内部 connection = pymysql.connect( host=host, user=user, password=pass1, db=database, charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor ) try: with connection.cursor() as cursor: dateandtime = time.strftime("%Y-%m-%d %H:%M:%S") logf.write(dateandtime + "- 3 - Getting the sensor value\n") # Fetch the sensor name sql = "SELECT temp FROM expected_temp WHERE name = (select name from sensor where id = %s)" cursor.execute(sql, (sens,)) result = cursor.fetchall() # 确保获取到结果后返回数值类型的温度 if result: # 直接返回数值,不要转成字符串 return float(result[0]["temp"]) else: # 处理没有查询到结果的情况,比如返回一个默认值或者抛出异常 logf.write(dateandtime + "- 警告:未查询到预期温度值\n") return 25.0 # 默认值示例 finally: connection.close() # 确保数据库连接被关闭 if __name__ == '__main__': #Setup the GPIO GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(17,GPIO.OUT) GPIO.setup(18,GPIO.OUT) # 原代码里没初始化18引脚,这里补上 try: while True: # 获取当前时间(每次循环都更新,避免时间一直是程序启动时的) dateandtime = time.strftime("%Y-%m-%d %H:%M:%S") humidity, temperature = readAdafruitDHT('2302',17) logf.write(dateandtime + "- 2 - Reading temperature\n") target = query() # 现在target是浮点数,和temperature类型一致,可以正常比较 if temperature > target: print(f"{dateandtime} - Current temperature: {temperature:.2f}") logf.write(f"{dateandtime} - 3 - Current temperature: {temperature:.2f}\n") print(f"{dateandtime} - Changing to HIGH") logf.write(f"{dateandtime} - Changing to HIGH\n") GPIO.output(18,GPIO.HIGH) else: print(f"{dateandtime} - Current temperature: {temperature:.2f}") logf.write(f"{dateandtime} - 3 - Current temperature: {temperature:.2f}\n") print(f"{dateandtime} - Changing to LOW") logf.write(f"{dateandtime} - Changing to LOW\n") GPIO.output(18,GPIO.LOW) time.sleep(20) except KeyboardInterrupt: GPIO.cleanup() logf.close() # 关闭日志文件 print("Bye")
关键修改点说明
- 让
query()返回数值:查询到结果后直接返回float(result[0]["temp"]),确保target是浮点数,和传感器读取的temperature类型一致。 - 修复缩进:把数据库连接的代码正确缩进在
query函数内部,保证函数执行时能正常连接数据库查询。 - 处理空结果:增加了查询不到结果的处理逻辑,避免程序因为
result为空而报错。 - 补全GPIO初始化:原代码里操作了GPIO18但没初始化,这里补上
GPIO.setup(18,GPIO.OUT)。 - 更新时间戳:把
dateandtime的获取放在循环内部,确保每次循环都用当前时间。
这样修改后,温度比较的逻辑应该就能正常工作了。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

