如何在Flask中从SQLite返回JSON?城市列表返回null问题排查
解决Flask从SQLite返回城市JSON列表时出现null的问题
嘿,我来帮你搞定这个问题!你遇到的Flask返回null而不是预期城市列表的问题,主要是代码里的几个小疏漏和错误导致的,咱们一步步梳理修复:
一、先揪出你代码里的明显问题
- 你写的
db.row_factory = sqlit...是拼写错误!应该是sqlite3.Row(这个是用来让查询结果以字典形式返回的行工厂),这会直接导致数据库查询的结果处理异常。 - 目前你的代码里没有
/city对应的路由函数,也看不到执行数据库查询的逻辑——没有查询怎么会返回城市列表呢?这肯定会返回null或者报错。 - 还缺少数据库连接的自动关闭逻辑,长期运行可能会导致连接泄漏。
二、修正后的完整可运行代码
from flask import Flask, g, jsonify import sqlite3 app = Flask(__name__) DATABASE = 'database.db' def get_db(): db = getattr(g, '_database', None) if db is None: db = g._database = sqlite3.connect(DATABASE) # 修正拼写错误,设置行工厂为sqlite3.Row,支持按列名取数据 db.row_factory = sqlite3.Row return db # 请求结束后自动关闭数据库连接,避免泄漏 @app.teardown_appcontext def close_db_connection(exception): db = getattr(g, '_database', None) if db is not None: db.close() # 封装一个通用查询函数,简化SQL执行操作 def query_db(query, args=(), one=False): cur = get_db().execute(query, args) results = cur.fetchall() cur.close() # 如果one为True,返回单个结果;否则返回所有结果 return (results[0] if results else None) if one else results # 这就是你需要的/city路由 @app.route('/city') def fetch_cities(): # 假设你的城市表名为cities,存储城市名的字段是name # 这里根据你的实际表结构修改! city_records = query_db('SELECT name FROM cities') # 从查询结果中提取城市名称,转为列表 city_list = [record['name'] for record in city_records] # 用jsonify返回标准JSON响应 return jsonify(city_list) if __name__ == '__main__': app.run(debug=True)
三、关键修复点解释
- 修正行工厂拼写:把半截的
sqlit...改成sqlite3.Row,这样查询出来的每一行都可以像字典一样通过列名访问,方便提取城市名称。 - 添加连接自动关闭:用
@app.teardown_appcontext装饰的函数会在每个请求结束后自动关闭数据库连接,避免资源浪费。 - 封装查询逻辑:
query_db函数帮你处理游标、执行SQL、获取结果的重复工作,让路由代码更简洁。 - 正确提取并返回数据:从查询到的记录中提取城市名称组成列表,再用
jsonify返回——这样浏览器就能拿到你预期的["city1", "city2", ...]格式的JSON了。
四、额外要检查的地方
- 确认你的
database.db里真的有cities表,而且name字段确实存着城市名称,如果表名或字段名不一样,记得修改SELECT name FROM cities里的内容。 - 开启debug模式(代码里的
app.run(debug=True)),如果还有问题,控制台会输出详细错误信息,方便你进一步排查。
内容的提问来源于stack exchange,提问作者derriadiergummi
相关产品推荐
相关产品推荐

