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

Flask+SQLAlchemy中字典化列表转JSON报错,求解决方案

解决SQLAlchemy LegacyRow无法JSON序列化的问题

问题根源

你遇到的TypeError: Object of type LegacyRow is not JSON serializable,是因为engine.execute()返回的结果行并非普通Python元组,而是SQLAlchemy的LegacyRow对象——哪怕你通过循环转成了带索引的字典,字典里的值依然是LegacyRow类型,标准json.dumps()无法识别这种自定义对象。

解决方案

方案1:将结果行转为普通元组/列表

在获取结果后,先把每个LegacyRow转成普通元组,再进行后续处理:

@app.route('/test/',methods=['GET'])
def search_item():
    result = engine.execute('SQL query codes')
    # 将LegacyRow转为普通元组列表
    test = list(map(tuple, result.fetchall()))
    # 生成带索引的字典
    test_dict = {i: item for i, item in enumerate(test)}
    tmp = json.dumps(test_dict)
    return tmp

方案2:直接获取字典格式结果(推荐)

利用SQLAlchemy的mappings()方法,直接获取以列名为键的字典列表,既避免类型问题,又让返回的JSON更具可读性:

@app.route('/test/',methods=['GET'])
def search_item():
    result = engine.execute('SQL query codes')
    # 直接将每行转为字典(键为数据库列名)
    rows = [dict(row) for row in result.mappings()]
    # 生成带索引的字典(如果需要)
    test_dict = {i: row for i, row in enumerate(rows)}
    tmp = json.dumps(test_dict)
    return tmp

这种方式返回的JSON会包含列名(比如{"0": {"id": "01", "name": "Bob", "job": "Engineer", "gender": "M"}}),前端处理时更直观。

方案3:自定义JSON编码器(全局复用)

如果项目中频繁需要序列化SQLAlchemy行对象,可以自定义JSON编码器来统一处理:

import json
from sqlalchemy.engine.row import LegacyRow

class SQLAlchemyJSONEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, LegacyRow):
            return dict(obj)  # 将LegacyRow转为字典
        return super().default(obj)

# 在接口中使用
@app.route('/test/',methods=['GET'])
def search_item():
    result = engine.execute('SQL query codes')
    test = result.fetchall()
    test_dict = {i: item for i, item in enumerate(test)}
    tmp = json.dumps(test_dict, cls=SQLAlchemyJSONEncoder)
    return tmp

内容的提问来源于stack exchange,提问作者deeded307

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:55:24