Flask应用从SQLite取数据用Pandas绘图报KeyError错误求助
错误根因
pd.read_sql_table() 方法的 columns 参数需传入列表格式的列名组合,你当前传入的是单个字符串 'time'/'tuhgaz',Pandas会将字符串识别为可迭代对象拆解为单个字符遍历,尝试查找名为 t 的列,直接触发 KeyError: 't' 报错。
修复方案
方案1:修改Pandas读取逻辑(最小改动)
直接调整columns参数格式,同时一次读取两列减少数据库查询次数,最终转换为列表传给前端绘图:
@app.route('/newdiagram') def newdiagram(): cxn = sqlite3.connect('blog.db') data = pd.read_excel('new46_1k1.xlsx', sheet_name='sheet1') data.to_sql(name='tablekot', con=cxn, if_exists='append', index=False) cxn.commit() cxn.close() engine = create_engine('sqlite:///blog.db') # 一次读取所需两列,columns参数传列表 df = pd.read_sql_table('tablekot', con=engine, columns=['time', 'tuhgaz']) # 转成前端绘图可用的列表格式,时间列可按需转字符串 labels = df['time'].dt.strftime('%Y-%m-%d %H:%M:%S').tolist() values = df['tuhgaz'].tolist() return render_template("newdiagram.html", labels=labels, values=values)
方案2:使用Flask-SQLAlchemy模型查询(更符合项目规范)
你已经定义了Tablekot模型,无需额外引入sqlite3、pandas、sqlalchemy引擎即可完成数据查询:
@app.route('/newdiagram') def newdiagram(): # 可选:只在第一次请求时写入Excel数据,避免重复插入 if Tablekot.query.first() is None: data = pd.read_excel('new46_1k1.xlsx', sheet_name='sheet1') cxn = sqlite3.connect('blog.db') data.to_sql(name='tablekot', con=cxn, if_exists='append', index=False) cxn.commit() cxn.close() # 直接用模型查询数据 records = Tablekot.query.all() labels = [record.time.strftime('%Y-%m-%d %H:%M:%S') for record in records] values = [record.tuhgaz for record in records] return render_template("newdiagram.html", labels=labels, values=values)
注意事项
- 原有逻辑每次访问
/newdiagram都会重复插入Excel数据,建议加存在性判断避免数据冗余 - 需保证Excel文件的列名和
Tablekot模型定义的列名完全一致,避免写入时列不匹配 - 前端绘图一般要求传入标准列表格式,不要直接传递DataFrame对象到模板
内容的提问来源于stack exchange,提问作者Denis
相关产品推荐
相关产品推荐

