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

在PyQt5 GUI中绘制SQL查询返回的datetime类型数据报错如何解决?

报错原因与修复方案

核心错误点

  • 游标取数方法调用遗漏括号:代码中self.result = self.mycursor.fetchall写法错误,fetchall是可调用方法,必须添加()才能执行并返回查询结果,否则只是把方法对象本身赋值给变量,这也是你看到builtin_function_or_method类型报错的直接诱因。
  • 数据遍历逻辑不规范:执行SQL后不建议直接遍历游标对象self.mycursor,应该遍历fetchall()返回的结果集合,避免游标状态异常引发的读取问题。
  • 取数逻辑未触发:你当前的信号槽仅绑定了Plot绘图方法,触发绘图前没有调用db_plot_values执行数据库查询,self.x和self.y未被初始化,也会引发报错。
  • (可选优化)类型兼容处理:matplotlib原生支持datetime和decimal类型绘图,如果你需要更稳妥的兼容性,可以手动将日期转成字符串、decimal转成浮点型。

修正后的代码片段

def db_plot_values(self):
    self.mydb = mysql.connector.connect(host="localhost",
                        user="root",
                        password="*********",
                        database="allocation")
    self.mycursor = self.mydb.cursor()

    # 执行SQL查询
    self.mycursor.execute("select date, net_data from table1 where point = '5'")
    # 加()调用fetchall方法获取结果集
    self.result = self.mycursor.fetchall()
    # 用完关闭游标和数据库连接,避免资源泄漏
    self.mycursor.close()
    self.mydb.close()

    date = []
    net_data = []
    # 遍历结果集赋值
    for i in self.result:
        # 可选类型转换:i[0]是datetime.date,转成字符串格式
        date.append(str(i[0]))
        # 可选类型转换:i[1]是decimal类型,转成float
        net_data.append(float(i[1]))
    
    self.x = date
    self.y = net_data

def Plot(self):
    # 绘图前先执行数据库取数,保证数据存在且最新
    self.db_plot_values()
    self.sc.plot(self.x,self.y)

注意:如果你的查询结果没有表头行,myCanvas类的plot方法里不需要做x[1:]/y[1:]切片,直接传入完整的x、y列表即可。

内容的提问来源于stack exchange,提问作者E. Artemis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:21:00