跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

Flask 入门:数据库记录集转换为 JSON 返回

Flask 框架中 jsonify 设置 Content-Type 为 application/json 符合 HTTP 协议。将数据库查询结果集转换为字典列表可通过 mappings 方法、自定义函数或 cursor.description 结合 zip 实现。最终通过 jsonify 构造响应对象或 make_response 返回给前端。

热情发布于 2025/2/7更新于 2026/9/1069 浏览
Flask 入门:数据库记录集转换为 JSON 返回

Flask 框架中记录集转 JSON 的方法

Flask 框架里,可以用 jsonify 返回 JSON 数据,但是为什么不用 Python 自带的 json 模块返回 JSON 数据呢?

其实两者是差不多的,jsonify 指明了 Content-Type 是 application/json,这样做是符合 HTTP 协议的规定的,这就是使用 jsonify 的原因之一。

但是从数据集转 jsonify 有很多细节需要注意,本文将介绍数据集转 jsonify 处理的几种办法。

基础代码结构

import config
from exts import db
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from flask import jsonify, make_response

app = Flask(__name__)
# 从 config.py 文件中获取数据库配置信息
app.config.from_object(config)
db = SQLAlchemy(app)

@app.route('/weather', methods=['GET', 'POST'])
def getjson():
    pass

if __name__ == '__main__':
    app.run()

将记录集转换为字典列表

下面代码封装了一个将记录集和数据字段名称转换为字典列表的函数,通过 cursor.description 获取数据字段元数据,通过 zip 将字段名和结果封装起来。

def rows_as_dicts(cursor):
    # 将游标集转换为字典类型列表
    col_names = [i[0] for i in cursor.description]
    return [dict(zip(col_names, row)) for row in cursor]

下面代码是通过 mappings 方法将结果集转换为字典列表。

sql = "select userid,username,password,personalname,birthday,sex,phone,postcard,address from userinfo"
result = db.session.execute(sql)
# 1、mappings 方式,最简单直接
results_as_dict = result.mappings().all()
# [{'userid': 1, 'username': 'admin', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'birthday': '1976-11-08', 'sex': '男', 'phone': 'eeee', 'postcard': 'dddd', 'address': '44444444'},
# {'userid': 2, 'username': 'admin1', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'birthday': '1976-11-03', 'sex': '男', 'phone': '', 'postcard': '', 'address': '423'},
# ...
# {'userid': 17, 'username': 'admin33333', 'password': '1qaz!QAZ', 'personalname': '333', 'birthday': '2022-02-17', 'sex': '男', 'phone': '3333', 'postcard': '333', 'address': '333333'}]

数据集操作返回的数据类型

result = db.session.execute(sql)
print('result=', result)
# result= <sqlalchemy.engine.cursor.CursorResult object at 0x0000025FF5B36438>
print('type(result)=', type(result))
# type(result)= <class 'sqlalchemy.engine.cursor.CursorResult'>
result = db.session.execute(sql).fetchall()
print('result=', result)
# result= [(1, 'admin', '1qaz!QAZ', 'adminstrator', '1976-11-08', '男', 'eeee', 'dddd', '44444444'),
# (2, 'admin1', '1qaz!QAZ', 'adminstrator', '1976-11-03', '男', '', '', '423'),
print('type(result)=', type(result))
# type(result)= <class 'list'>
result = db.session.execute(sql).cursor
print('result=', result)
# result= <sqlite3.Cursor object at 0x0000025FF5AC6B20>
print('type(result)=', type(result))
# type(result)= <class 'sqlite3.Cursor'>

通过 rows_as_dicts 转换为字典列表

# 2、自定义函数,将游标集转换为字典列表
cursor = db.session.execute(sql).cursor
result = rows_as_dicts(cursor)
# [{'userid': 1, 'username': 'admin', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'birthday': '1976-11-08', 'sex': '男', 'phone': 'eeee', 'postcard': 'dddd', 'address': '44444444'},
# {'userid': 2, 'username': 'admin1', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'birthday': '1976-11-03', 'sex': '男', 'phone': '', 'postcard': '', 'address': '423'},
# ...
# {'userid': 17, 'username': 'admin33333', 'password': '1qaz!QAZ', 'personalname': '333', 'birthday': '2022-02-17', 'sex': '男', 'phone': '3333', 'postcard': '333', 'address': '333333'}]

分步骤获取数据操作返回的数据和数据类型

# 关于 cursor 和 cursor.description 介绍
cursor = db.session.execute(sql).cursor
# cursor.description 返回元祖类型元数据
# print('cursor.description=',cursor.description)
# (('userid', None, None, None, None, None, None),
# ('username', None, None, None, None, None, None),
# ('password', None, None, None, None, None, None),
# ...
# ('address', None, None, None, None, None, None))
# [i[0] for i in cursor.description],通过迭代获取元数据信息
# print('[i[0] for i in cursor.description]=',[i[0] for i in cursor.description])
# ['userid', 'username', 'password', 'personalname', 'birthday', 'sex', 'phone', 'postcard', 'address']
# print('[row for row in cursor]=',[row for row in cursor])
#  [(1, 'admin', '1qaz!QAZ', 'adminstrator', '1976-11-08', '男', 'eeee', 'dddd', '44444444'),
# (2, 'admin1', '1qaz!QAZ', 'adminstrator', '1976-11-03', '男', '', '', '423'),
# ...
# (17, 'admin33333', '1qaz!QAZ', '333', '2022-02-17', '男', '3333', '333', '333333')]
# db.session.execute 返回 CursorResult
r = db.session.execute(sql)
# db.session.execute(sql)= <sqlalchemy.engine.cursor.CursorResult object at 0x0000020353A069B0>
# 通过 fetchall() 获取记录集
result = r.fetchall()
# [(1, 'admin', '1qaz!QAZ', 'adminstrator', '1976-11-08', '男', 'eeee', 'dddd', '44444444'),
# (2, 'admin1', '1qaz!QAZ', 'adminstrator', '1976-11-03', '男', '', '', '423')
# ...
# (17, 'admin33333', '1qaz!QAZ', '333', '2022-02-17', '男', '3333', '333', '333333')]

结合 cursor.description 和结果集生成字典列表

# 3、通过
resultproxy = db.session.execute(sql)
resultdict = []
# resultproxy= <sqlalchemy.engine.cursor.CursorResult object at 0x000001D48DB93B00>
# resultproxy.keys= <bound method _WithKeys.keys of <sqlalchemy.engine.cursor.CursorResult object at 0x000001D48DB93B00>>
colname = [i[0] for i in cursor.description]
print('colname=', colname)
for rowproxy in resultproxy:
    rowresult = dict(zip(colname, rowproxy))
    # rowproxy= (1, 'admin', '1qaz!QAZ', 'adminstrator', '1976-11-08', '男', 'eeee', 'dddd', '44444444')
    # rowproxy type= <class 'sqlalchemy.engine.row.Row'>
    # rowresult= {'userid': 1, 'username': 'admin', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'birthday': '1976-11-08', 'sex': '男', 'phone': 'eeee', 'postcard': 'dddd', 'address': '44444444'}
    resultdict.append(rowresult)
# rowresult =
# [{'userid': 1, 'username': 'admin', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'birthday': '1976-11-08', 'sex': '男', 'phone': 'eeee', 'postcard': 'dddd', 'address': '44444444'},
# {'userid': 2, 'username': 'admin1', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'birthday': '1976-11-03', 'sex': '男', 'phone': '', 'postcard': '', 'address': '423'},
# ...
# {'userid': 17, 'username': 'admin33333', 'password': '1qaz!QAZ', 'personalname': '333', 'birthday': '2022-02-17', 'sex': '男', 'phone': '3333', 'postcard': '333', 'address': '333333'}]

字典列表 JSON 化及响应返回

下面是讲字典列表 json 化,并通过 response 响应回前端的两种方式。

# jsonify 及返回响应的两种方法
# 1、通过构造 response 方式
response = jsonify(resultdict)
response.status_code = 200  # or 400 or whatever
# ---------------response.data----------------
print('response.data',response.data)
# response.data b'[{"address":"44444444","birthday":"1976-11-08","password":"1qaz!QAZ","personalname":"adminstrator","phone":"eeee","postcard":"dddd","sex":"\\u7537","userid":1,"username":"admin"},
# {"address":"423","birthday":"1976-11-03","password":"1qaz!QAZ","personalname":"adminstrator","phone":"","postcard":"","sex":"\\u7537","userid":2,"username":"admin1"},
# ...
# {"address":"333333","birthday":"2022-02-17","password":"1qaz!QAZ","personalname":"333","phone":"3333","postcard":"333","sex":"\\u7537","userid":17,"username":"admin33333"}]\n'
# ---------------response.json----------------
# response.json [{'address': '44444444', 'birthday': '1976-11-08', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'phone': 'eeee', 'postcard': 'dddd', 'sex': '男', 'userid': 1, 'username': 'admin'}, 
# {'address': '423', 'birthday': '1976-11-03', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'phone': '', 'postcard': '', 'sex': '男', 'userid': 2, 'username': 'admin1'}, 
# ... 
# {'address': '333333', 'birthday': '2022-02-17', 'password': '1qaz!QAZ', 'personalname': '333', 'phone': '3333', 'postcard': '333', 'sex': '男', 'userid': 17, 'username': 'admin33333'}]
# response.headers Content-Type: application/json
# Content-Length: 3012
# ---------------response.headers----------------
# response.headers Content-Type: application/json
# ---------------response.status_code----------------
# response.status_code 200
# ---------------response.content_length----------------
# Content-Length: 3012
return response

# 2、通过 make_response 方式
# return make_response(jsonify(resultdict), 200)

目录

  1. Flask 框架中记录集转 JSON 的方法
  2. 基础代码结构
  3. 从 config.py 文件中获取数据库配置信息
  4. 将记录集转换为字典列表
  5. 1、mappings 方式,最简单直接
  6. [{'userid': 1, 'username': 'admin', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'birthday': '1976-11-08', 'sex': '男', 'phone': 'eeee', 'postcard': 'dddd', 'address': '44444444'},
  7. {'userid': 2, 'username': 'admin1', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'birthday': '1976-11-03', 'sex': '男', 'phone': '', 'postcard': '', 'address': '423'},
  8. ...
  9. {'userid': 17, 'username': 'admin33333', 'password': '1qaz!QAZ', 'personalname': '333', 'birthday': '2022-02-17', 'sex': '男', 'phone': '3333', 'postcard': '333', 'address': '333333'}]
  10. 数据集操作返回的数据类型
  11. result= <sqlalchemy.engine.cursor.CursorResult object at 0x0000025FF5B36438>
  12. type(result)= <class 'sqlalchemy.engine.cursor.CursorResult'>
  13. result= [(1, 'admin', '1qaz!QAZ', 'adminstrator', '1976-11-08', '男', 'eeee', 'dddd', '44444444'),
  14. (2, 'admin1', '1qaz!QAZ', 'adminstrator', '1976-11-03', '男', '', '', '423'),
  15. type(result)= <class 'list'>
  16. result= <sqlite3.Cursor object at 0x0000025FF5AC6B20>
  17. type(result)= <class 'sqlite3.Cursor'>
  18. 通过 rowsasdicts 转换为字典列表
  19. 2、自定义函数,将游标集转换为字典列表
  20. [{'userid': 1, 'username': 'admin', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'birthday': '1976-11-08', 'sex': '男', 'phone': 'eeee', 'postcard': 'dddd', 'address': '44444444'},
  21. {'userid': 2, 'username': 'admin1', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'birthday': '1976-11-03', 'sex': '男', 'phone': '', 'postcard': '', 'address': '423'},
  22. ...
  23. {'userid': 17, 'username': 'admin33333', 'password': '1qaz!QAZ', 'personalname': '333', 'birthday': '2022-02-17', 'sex': '男', 'phone': '3333', 'postcard': '333', 'address': '333333'}]
  24. 分步骤获取数据操作返回的数据和数据类型
  25. 关于 cursor 和 cursor.description 介绍
  26. cursor.description 返回元祖类型元数据
  27. print('cursor.description=',cursor.description)
  28. (('userid', None, None, None, None, None, None),
  29. ('username', None, None, None, None, None, None),
  30. ('password', None, None, None, None, None, None),
  31. ...
  32. ('address', None, None, None, None, None, None))
  33. [i[0] for i in cursor.description],通过迭代获取元数据信息
  34. print('[i[0] for i in cursor.description]=',[i[0] for i in cursor.description])
  35. ['userid', 'username', 'password', 'personalname', 'birthday', 'sex', 'phone', 'postcard', 'address']
  36. print('[row for row in cursor]=',[row for row in cursor])
  37. [(1, 'admin', '1qaz!QAZ', 'adminstrator', '1976-11-08', '男', 'eeee', 'dddd', '44444444'),
  38. (2, 'admin1', '1qaz!QAZ', 'adminstrator', '1976-11-03', '男', '', '', '423'),
  39. ...
  40. (17, 'admin33333', '1qaz!QAZ', '333', '2022-02-17', '男', '3333', '333', '333333')]
  41. db.session.execute 返回 CursorResult
  42. db.session.execute(sql)= <sqlalchemy.engine.cursor.CursorResult object at 0x0000020353A069B0>
  43. 通过 fetchall() 获取记录集
  44. [(1, 'admin', '1qaz!QAZ', 'adminstrator', '1976-11-08', '男', 'eeee', 'dddd', '44444444'),
  45. (2, 'admin1', '1qaz!QAZ', 'adminstrator', '1976-11-03', '男', '', '', '423')
  46. ...
  47. (17, 'admin33333', '1qaz!QAZ', '333', '2022-02-17', '男', '3333', '333', '333333')]
  48. 结合 cursor.description 和结果集生成字典列表
  49. 3、通过
  50. resultproxy= <sqlalchemy.engine.cursor.CursorResult object at 0x000001D48DB93B00>
  51. resultproxy.keys= <bound method _WithKeys.keys of <sqlalchemy.engine.cursor.CursorResult object at 0x000001D48DB93B00>>
  52. rowresult =
  53. [{'userid': 1, 'username': 'admin', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'birthday': '1976-11-08', 'sex': '男', 'phone': 'eeee', 'postcard': 'dddd', 'address': '44444444'},
  54. {'userid': 2, 'username': 'admin1', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'birthday': '1976-11-03', 'sex': '男', 'phone': '', 'postcard': '', 'address': '423'},
  55. ...
  56. {'userid': 17, 'username': 'admin33333', 'password': '1qaz!QAZ', 'personalname': '333', 'birthday': '2022-02-17', 'sex': '男', 'phone': '3333', 'postcard': '333', 'address': '333333'}]
  57. 字典列表 JSON 化及响应返回
  58. jsonify 及返回响应的两种方法
  59. 1、通过构造 response 方式
  60. ---------------response.data----------------
  61. response.data b'[{"address":"44444444","birthday":"1976-11-08","password":"1qaz!QAZ","personalname":"adminstrator","phone":"eeee","postcard":"dddd","sex":"\\u7537","userid":1,"username":"admin"},
  62. {"address":"423","birthday":"1976-11-03","password":"1qaz!QAZ","personalname":"adminstrator","phone":"","postcard":"","sex":"\\u7537","userid":2,"username":"admin1"},
  63. ...
  64. {"address":"333333","birthday":"2022-02-17","password":"1qaz!QAZ","personalname":"333","phone":"3333","postcard":"333","sex":"\\u7537","userid":17,"username":"admin33333"}]\n'
  65. ---------------response.json----------------
  66. response.json [{'address': '44444444', 'birthday': '1976-11-08', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'phone': 'eeee', 'postcard': 'dddd', 'sex': '男', 'userid': 1, 'username': 'admin'},
  67. {'address': '423', 'birthday': '1976-11-03', 'password': '1qaz!QAZ', 'personalname': 'adminstrator', 'phone': '', 'postcard': '', 'sex': '男', 'userid': 2, 'username': 'admin1'},
  68. ...
  69. {'address': '333333', 'birthday': '2022-02-17', 'password': '1qaz!QAZ', 'personalname': '333', 'phone': '3333', 'postcard': '333', 'sex': '男', 'userid': 17, 'username': 'admin33333'}]
  70. response.headers Content-Type: application/json
  71. Content-Length: 3012
  72. ---------------response.headers----------------
  73. response.headers Content-Type: application/json
  74. ---------------response.status_code----------------
  75. response.status_code 200
  76. ---------------response.content_length----------------
  77. Content-Length: 3012
  78. 2、通过 make_response 方式
  79. return make_response(jsonify(resultdict), 200)

更多推荐文章

查看全部
  • 算法:双指针解法 - 复写零
  • Kiro 工具实测:前端代码生成验证与调整
  • Mac 基于 LLaMA Factory 微调模型并导入 Ollama 实践
  • Claude Skills 详解:功能特性、应用场景与实战指南
  • OpenClaw 深度调优:5 步让 AI 助手从聊天变实干
  • Anything XL 教程:Streamlit 实时预览与生成进度可视化
  • 用 龙虾10 分钟搞定 C 语言 + 前端实训?我试了,真香!
  • GitHub Copilot 学生认证教程及免费使用指南
  • OpenClaw 飞书机器人搭建指南
  • Ace-Translate 本地离线 AI 翻译工具使用指南
  • 本地部署 OpenClaw 配置飞书机器人指南
  • AI 大模型嵌入模型性能优化:缓存机制实战
  • C、Java、Python 三大语言对比与未来选择指南
  • 网络安全学习计划与就业方向指南
  • Stable Diffusion 模型原理与本地部署实践
  • Llama 与 PyTorch:大模型开发与微调实战
  • Python 数据统计指南:从入门到实战
  • AI 元人文:自感概念与 DOS 模型深度解析
  • 主流无人机厂商 RemoteID 支持情况汇总
  • 利用 Figma 插件将 AI 生成的 HTML 原型导入 Axure

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online