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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:25:42