Flask中Dropdown Box无法显示IBM DB获取的数据
解决Flask下拉框无法渲染IBM DB数据的问题
核心问题分析
你后端用cur.fetchall()默认返回的是元组列表(比如[(1, "扳手"), (2, "螺丝刀")]),但HTML模板里用的是字典的属性访问方式(row.id、row.tools),这就导致模板无法正确读取数据,所以下拉框为空。
解决方案(两种可选)
方案1:使用字典游标(推荐)
修改后端代码,创建游标时指定返回字典格式,这样fetchall()会直接返回字典列表,和你模板里的访问方式匹配:
@app.route("/unplanned_outage", methods=['GET', 'POST']) def unplanned_outage(): global conn ibm_db_conn = ibm_db.connect("DATABASE=bludb;HOSTNAME=hostname;PORT=1234;SECURITY=SSL;;UID=uid;PWD=pwd;", '', '') conn = ibm_db_dbi.Connection(ibm_db_conn) # 创建字典游标,返回字典格式的结果 cur = conn.cursor(dictionary=True) select="select * from tools" cur.execute(select) tools = cur.fetchall() print("Query results:\n") print(tools,end="\n") cur.close() return render_template(r'page.html', tools=tools)
方案2:手动转换元组为字典
如果你的ibm_db_dbi版本不支持dictionary=True参数,可以手动把元组列表转换成字典列表:
@app.route("/unplanned_outage", methods=['GET', 'POST']) def unplanned_outage(): global conn ibm_db_conn = ibm_db.connect("DATABASE=bludb;HOSTNAME=hostname;PORT=1234;SECURITY=SSL;;UID=uid;PWD=pwd;", '', '') conn = ibm_db_dbi.Connection(ibm_db_conn) cur = conn.cursor() select="select * from tools" cur.execute(select) # 获取字段名,用于生成字典的key column_names = [desc[0] for desc in cur.description] # 转换元组为字典 tools = [dict(zip(column_names, row)) for row in cur.fetchall()] print("Query results:\n") print(tools,end="\n") cur.close() return render_template(r'page.html', tools=tools)
额外检查项
- 确认数据库表
tools的字段名确实是id和tools,如果字段名不同(比如tool_id、tool_name),要对应修改模板里的row.id、row.tools为实际字段名。 - 不需要添加JS代码,这是服务器端渲染的问题,Jinja2模板可以直接处理数据。
内容的提问来源于stack exchange,提问作者fneiwfwiem
相关产品推荐
相关产品推荐

