FastAPI使用模板时数据不显示问题及结果类型疑问
问题解决:FastAPI模板不显示SQLite数据及查询结果格式问题
一、模板不显示数据的修复
你的模板存在三个关键错误,导致数据无法渲染:
- 上下文变量名不匹配:在
TemplateResponse中传递的变量是"Stocks": rows,但模板里遍历的是rows,两者名称不一致 - 循环变量引用错误:循环内写的
{{ rows.id }},应该用循环变量row而非原列表rows,即{{ row.id_ticker }}(注意字段名要和SQL查询的列名一致) - HTML标签拼写错误:
<tile>是笔误,应改为<title>
修正后的index.html示例:
<html> <head> <title>Stocks</title> </head> <body> <h1>Stocks</h1> <table border="1"> {% for row in Stocks %} <tr> <td>{{ row.id_ticker }}</td> <td>{{ row.tx_ticker_symbol }}</td> <td>{{ row.tx_ticker_code }}</td> <td>{{ row.tx_ticker_name }}</td> <td>{{ row.tx_ticker_fullname }}</td> </tr> {% endfor %} </table> </body> </html>
额外提示:当前你在FastAPI启动时就执行了数据库查询,后续数据库更新后页面不会自动刷新最新数据。如果需要每次请求都获取最新数据,应把查询逻辑移到路由函数内:
@app.get("/") def index(request: Request): idb = sqle.db_engine(tg_db_name, data_path) idb.connect() rows = idb.ticker_list() idb.close_db() return templates.TemplateResponse("index.html", {"request": request, "Stocks": rows})
二、查询返回列表而非字典的原因及解决
SQLite默认的游标执行fetchall()时,返回的是元组列表,每个元组对应一行数据,因此你看到的类型是list。如果需要返回字典格式的结果,有两种常用方法:
方法1:设置游标为字典格式
在数据库连接后,设置row_factory为sqlite3.Row,这样查询结果会返回Row对象列表,既可以像字典一样通过键名访问字段,也支持索引访问:
import sqlite3 # 在你的db_engine类的connect方法中添加: self.conn = sqlite3.connect(你的数据库路径) self.conn.row_factory = sqlite3.Row # 启用字典式行对象 self.cursor = self.conn.cursor()
方法2:手动将元组转换为字典
查询后结合列名,把每个元组转换成字典:
mySql = ('''SELECT id_ticker, tx_ticker_symbol, tx_ticker_code, tx_ticker_name, tx_ticker_fullname FROM Ticker''') self.cursor.execute(mySql) # 获取查询的列名 columns = [desc[0] for desc in self.cursor.description] # 将元组列表转为字典列表 rows = [dict(zip(columns, row)) for row in self.cursor.fetchall()] return rows
内容的提问来源于stack exchange,提问作者gfx Prog
相关产品推荐
相关产品推荐

