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

Python中MySQL查询结果值比较失效问题求助

解决Python中MySQL查询结果与温度值比较失效的问题

我帮你排查了下代码里的几个关键问题,这应该就是比较逻辑无法正常工作的原因:

核心问题分析

  1. query()函数没有返回值:你当前的query函数只打印了查询到的温度值,但没有把结果返回给调用它的target变量。这会导致target实际上是None,拿温度数值和None做比较肯定得不到正确结果。
  2. 类型不匹配:你把查询到的temp转成了字符串类型(nam = str(na)),但从传感器读取的temperature是浮点数。字符串和数值直接比较会触发Python的类型比较逻辑,结果和你预期的数值大小比较完全不同。
  3. 代码缩进错误:原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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:08:47