You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:51:43