如何在Flask中按数据库列顺序调整SELECT *查询的JSON输出?
调整Flask返回JSON的字段顺序问题
嘿,我来帮你搞定这个问题!你当前遇到的字段顺序不一致,主要是两个原因:一是SELECT *返回的列顺序可能和你数据库表的实际列顺序不匹配,二是在Python 3.7之前,普通字典不保证插入顺序,导致jsonify输出的字段顺序乱掉了。下面给你两种实用的解决方案:
方案一:显式指定查询列顺序(推荐)
这是最稳妥的方式,既能精准控制字段顺序,还能避免以后表结构新增列时,JSON输出意外包含无关字段。把你的查询语句从SELECT *改成明确列出目标列,顺序就是你想要的JSON输出顺序:
@app.route('/') def get(): cur = mysql.connect().cursor() # 按期望的顺序列出列,直接对齐JSON输出顺序 cur.execute('''select userID, username, password from user''') r = [dict((cur.description[i][0], value) for i, value in enumerate(row)) for row in cur.fetchall()] return jsonify({'myCollection' : r})
Python 3.7及以上版本的字典会保留插入顺序,所以jsonify输出的JSON字段顺序会和你查询时指定的列顺序完全一致。
方案二:使用OrderedDict保证顺序(兼容旧版Python)
如果你还在使用Python 3.6或更早的版本,普通字典不支持有序存储,这时候可以用collections.OrderedDict来强制锁定字段顺序:
首先导入OrderedDict:
from collections import OrderedDict from flask import Flask, jsonify from flaskext.mysql import MySQL
然后修改生成结果列表的代码:
@app.route('/') def get(): cur = mysql.connect().cursor() cur.execute('''select * from user''') # 用OrderedDict替代普通dict,严格遵循查询结果的列顺序构建字典 r = [OrderedDict((cur.description[i][0], value) for i, value in enumerate(row)) for row in cur.fetchall()] return jsonify({'myCollection' : r})
这样不管你的Python版本是多少,JSON输出的字段顺序都会和查询结果的列顺序保持一致。
额外提示:如果SELECT *返回的列顺序和数据库表的列顺序不一致,大概率是数据库驱动的小问题,这时候显式指定列就完全规避了这个风险,同时让你的代码更清晰可读。
内容的提问来源于stack exchange,提问作者itTech
相关产品推荐
相关产品推荐

