使用Flask+sqlite3开发Web应用:查询结果无属性名显示问题
解决SQLite查询结果不显示列名的问题
一、SQLite命令行中显示列名
如果是在SQLite命令行工具中查询时看不到列名,有两种快速解决方式:
- 启动命令行时加上
-header参数:sqlite3 -header your_database.db - 已经进入shell后,执行以下命令开启列名显示并优化输出格式:
之后再执行.header on .mode columnSELECT * FROM registrants;,就会得到带列名的规整表格输出。
二、Flask代码中获取带列名的查询结果
在Flask应用里用Python的sqlite3模块查询时,默认返回的是元组列表,没有列名映射。可以通过两种方式获取带列名的结构化结果:
方法1:手动组合列名与结果
通过游标对象的description属性提取列名,再与查询结果组合成字典列表:
import sqlite3 from flask import Flask, render_template app = Flask(__name__) @app.route('/registrants') def list_registrants(): conn = sqlite3.connect('your_database.db') cur = conn.cursor() cur.execute("SELECT * FROM registrants") # 提取所有列名 column_names = [col[0] for col in cur.description] # 将每行结果与列名绑定成字典 registrants = [dict(zip(column_names, row)) for row in cur.fetchall()] conn.close() return render_template('registrants.html', registrants=registrants)
方法2:使用sqlite3.Row对象
设置连接的row_factory为sqlite3.Row,让查询返回的行对象支持通过列名访问:
import sqlite3 from flask import Flask, render_template app = Flask(__name__) @app.route('/registrants') def list_registrants(): conn = sqlite3.connect('your_database.db') # 设置行工厂,让结果支持列名访问 conn.row_factory = sqlite3.Row cur = conn.cursor() cur.execute("SELECT * FROM registrants") # 直接获取行对象列表,可转成字典 registrants = [dict(row) for row in cur.fetchall()] conn.close() return render_template('registrants.html', registrants=registrants)
三、模板中渲染规整表格
在Jinja2模板registrants.html中,可以直接遍历带列名的字典,渲染成结构化表格:
<table border="1"> <thead> <tr> <th>ID</th> <th>姓名</th> <th>用户名</th> <th>积分</th> </tr> </thead> <tbody> {% for user in registrants %} <tr> <td>{{ user.id }}</td> <td>{{ user.name }}</td> <td>{{ user.username }}</td> <td>{{ user.points }}</td> </tr> {% endfor %} </tbody> </table>
内容的提问来源于stack exchange,提问作者Vasanthan S R
相关产品推荐
相关产品推荐

