在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
相关产品推荐
相关产品推荐

