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
相关产品推荐
相关产品推荐

