Python将MySQL单行查询结果赋值为嵌套字典并转JSON的正确语法
当然可以!这种需求在实际开发里太常见了,我给你结合你要的嵌套JSON格式,一步步讲清楚怎么实现。
核心思路
先从MySQL取出单行数据,然后把字段值映射到你想要的嵌套Python字典结构里,最后用json模块转成JSON字符串就行。
具体代码示例
我用最常用的pymysql库来演示,如果你用的是mysql-connector,逻辑也是一样的。
1. 连接数据库并获取单行数据
这里推荐用DictCursor,它会把查询结果直接返回成字典形式,不用手动对应字段顺序,非常方便:
import pymysql import json # 连接数据库(替换成你的实际配置) conn = pymysql.connect( host='localhost', user='root', password='your_password', database='your_database' ) # 创建字典游标,查询结果直接是字典 cursor = conn.cursor(pymysql.cursors.DictCursor) # 执行查询,比如根据ID查一行数据 cursor.execute("SELECT id, name, school_name, school_address, city, zip_code FROM student WHERE id = %s", (1,)) row = cursor.fetchone() # 得到类似 {'id': 1, 'name': '小明', 'school_name': '实验中学', ...} 的字典 # 别忘了关闭连接 cursor.close() conn.close()
2. 构建嵌套结构的字典
把MySQL返回的字段值,对应填充到你要的嵌套结构里:
# 构建目标格式的字典 result = { "data": [ { "id": row["id"], "name": row["name"], "school": { "name": row["school_name"], "address": row["school_address"] }, "address": { "city": row["city"], "zip": row["zip_code"] } } ] }
3. 转为JSON字符串
用json.dumps()完成转换,注意加上ensure_ascii=False来保留中文,indent=4是格式化输出(可选,方便阅读):
json_str = json.dumps(result, ensure_ascii=False, indent=4) print(json_str)
输出的JSON就会是你想要的嵌套格式:
{ "data": [ { "id": 1, "name": "小明", "school": { "name": "实验中学", "address": "XX路123号" }, "address": { "city": "上海", "zip": "200000" } } ] }
几个注意点
- 如果不用
DictCursor,fetchone()会返回元组(比如(1, '小明', '实验中学', ...)),这时候就要按查询字段的顺序来取值,比如row[0]对应id,row[1]对应name,这种方式容易出错,还是推荐用字典游标。 - 如果查询结果可能为空(比如没找到对应数据),一定要先判断
row is not None,避免后面取键的时候抛出KeyError。 - 如果MySQL里有日期/时间类型的字段,
json.dumps()默认无法序列化,需要自定义一个序列化函数:
from datetime import datetime def serialize_datetime(obj): if isinstance(obj, datetime): return obj.strftime('%Y-%m-%d %H:%M:%S') raise TypeError(f"Type {type(obj)} not serializable") # 转JSON时传入default参数 json_str = json.dumps(result, ensure_ascii=False, indent=4, default=serialize_datetime)
内容的提问来源于stack exchange,提问作者Denoteone
相关产品推荐
相关产品推荐

