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

PyMySQL JSON 数据处理:Python 与 MySQL 交互

PyMySQL 提供 Python 与 MySQL 之间的 JSON 数据交互能力。Python 字典和列表可自动转换为 MySQL JSON 格式存储。查询时 JSON 字段自动解析为 Python 对象,支持直接访问嵌套属性。结合 MySQL 原生 JSON 函数可实现高效查询与更新。针对大数据量可使用服务器端游标优化内存,支持自定义编码器处理特殊类型。批量操作可提升效率,性能优化建议包括创建索引、部分提取及连接池使用。

SqlMaster发布于 2025/11/20更新于 2026/10/2693 浏览

PyMySQL JSON 数据处理:Python 与 MySQL 交互

你是否在 Python 开发中遇到过 MySQL JSON 字段处理的难题?当需要存储复杂结构数据时,传统关系型字段总是显得力不从心。本文将带你掌握 PyMySQL 中 JSON 数据的完整交互方案,从基础存储到高级查询,让你轻松应对各类 JSON 数据场景。

JSON 数据存储基础

在开始使用 PyMySQL 处理 JSON 数据前,我们需要先了解 MySQL 的 JSON 数据类型。MySQL 从 5.7 版本开始支持原生 JSON 类型,提供了高效的 JSON 数据存储和查询能力。使用 PyMySQL 操作 JSON 数据的核心在于理解 Python 数据结构与 MySQL JSON 格式之间的转换机制。

基本数据插入

使用 PyMySQL 插入 JSON 数据非常简单,只需将 Python 字典或列表直接作为参数传递给 SQL 语句。PyMySQL 会自动处理基本的类型转换,将 Python 数据结构转换为 MySQL 可接受的 JSON 格式。

import pymysql
from pymysql.cursors import DictCursor

# 连接数据库
connection = pymysql.connect(
    host='localhost',
    user='your_username',
    password='your_password',
    db='test_db',
    charset='utf8mb4',
    cursorclass=DictCursor
)

try:
    with connection.cursor() as cursor:
        # 创建包含 JSON 字段的表
        create_table_sql = """
        CREATE TABLE IF NOT EXISTS user_profiles (
            id INT AUTO_INCREMENT PRIMARY KEY,
            name VARCHAR(50) NOT NULL,
            preferences JSON NOT NULL,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
        """
        cursor.execute(create_table_sql)

        # 插入 JSON 数据
        insert_sql = "INSERT INTO user_profiles (name, preferences) VALUES (%s, %s)"

        # Python 字典会自动转换为 JSON 格式
        user_preferences = {
            "theme": "dark",
            "notifications": {"email": True, "push": False},
            "favorite_features": ["search", "analytics", ],
            : {: , : }
        }
        cursor.execute(insert_sql, (, user_preferences))
        connection.commit()
:
    connection.close()
"reports"
"display_options"
"font_size"
14
"density"
"comfortable"
"John Doe"
finally

PyMySQL 的类型转换逻辑主要在 converters.py 中实现。该模块定义了 Python 数据类型与 MySQL 数据类型之间的转换规则,确保字典、列表等复杂结构能正确序列化为 JSON 格式存储到数据库中。

数据类型映射

PyMySQL 处理 JSON 数据时,会将 Python 数据类型按照以下规则映射为 MySQL JSON 类型:

Python 类型MySQL JSON 类型转换说明
dictJSON 对象转换为 {"key": "value"} 格式
listJSON 数组转换为 ["item1", "item2"] 格式
strJSON 字符串直接作为 JSON 字符串存储
int/floatJSON 数字保持数字类型
boolJSON 布尔值转换为 true 或 false
NoneJSON null转换为 null

这些转换规则由 converters.py 中的 encoders 字典定义,确保 Python 数据能正确序列化为 MySQL 可接受的格式。

JSON 数据查询与解析

从 MySQL 查询 JSON 数据时,PyMySQL 会自动将 JSON 字段解析为 Python 字典或列表,使你可以像操作普通 Python 数据结构一样处理 JSON 数据。

基本查询操作
import pymysql
from pymysql.cursors import DictCursor

connection = pymysql.connect(
    host='localhost',
    user='your_username',
    password='your_password',
    db='test_db',
    charset='utf8mb4',
    cursorclass=DictCursor
)

try:
    with connection.cursor() as cursor:
        # 查询 JSON 数据
        select_sql = "SELECT id, name, preferences FROM user_profiles WHERE id = %s"
        cursor.execute(select_sql, (1,))
        result = cursor.fetchone()

        if result:
            print(f"User: {result['name']}")
            print("Preferences:")
            
            # 直接操作 JSON 字段解析后的 Python 字典
            preferences = result['preferences']
            
            # 访问 JSON 对象属性
            print(f"Theme: {preferences['theme']}")
            
            # 访问嵌套 JSON 对象
            print(f"Email notifications: {preferences['notifications']['email']}")
            
            # 遍历 JSON 数组
            print("Favorite features:")
            for feature in preferences['favorite_features']:
                print(f" - {feature}")
            
            # 修改 JSON 数据
            preferences['theme'] = 'light'
            preferences['display_options']['font_size'] = 16
            
            # 更新修改后的 JSON 数据
            update_sql = "UPDATE user_profiles SET preferences = %s WHERE id = %s"
            cursor.execute(update_sql, (preferences, result['id']))
            connection.commit()
finally:
    connection.close()

当从 MySQL 读取 JSON 字段时,PyMySQL 会使用 converters.py 中的 decoders 字典定义的规则,将 JSON 数据转换回相应的 Python 数据类型。这使得我们可以直接像操作普通 Python 字典一样处理 JSON 数据。

使用 MySQL JSON 函数查询

MySQL 提供了丰富的 JSON 函数,可以在 SQL 层面直接操作 JSON 数据。结合 PyMySQL,我们可以灵活地查询和修改 JSON 字段的特定部分:

-- 获取所有用户的主题偏好
SELECT name, preferences->'$.theme' AS theme FROM user_profiles;

-- 使用 JSON_EXTRACT 获取嵌套属性
SELECT name, JSON_EXTRACT(preferences, '$.display_options.font_size') AS font_size 
FROM user_profiles 
WHERE JSON_EXTRACT(preferences, '$.display_options.font_size') > 14;

-- 使用 JSON_SEARCH 查找包含特定元素的记录
SELECT name, preferences->'$.favorite_features' AS features 
FROM user_profiles 
WHERE JSON_SEARCH(preferences, 'one', 'analytics') IS NOT NULL;

-- 使用 JSON_SET 更新特定属性
UPDATE user_profiles 
SET preferences = JSON_SET(preferences, '$.notifications.push', true) 
WHERE id = %s;

高级 JSON 处理技巧

处理大型 JSON 数据

对于大型 JSON 数据,PyMySQL 提供了流式处理能力,可以通过 SSCursor(服务器端游标)来减少内存占用:

from pymysql.cursors import SSCursor

# 使用服务器端游标处理大型 JSON 数据
connection = pymysql.connect(
    host='localhost',
    user='your_username',
    password='your_password',
    db='large_data_db',
    cursorclass=SSCursor
)

try:
    with connection.cursor() as cursor:
        # 处理包含大型 JSON 数据的表
        sql = "SELECT id, large_json_data FROM big_data_table"
        cursor.execute(sql)
        
        # 逐条处理记录,避免一次性加载所有数据
        for row in cursor:
            record_id, json_data = row
            process_large_json(record_id, json_data)
finally:
    connection.close()
自定义 JSON 编码器和解码器

PyMySQL 允许你自定义 JSON 数据的编码和解码逻辑,以满足特定需求。你可以通过修改转换器来自定义 JSON 处理行为:

import json
from datetime import datetime
from pymysql import converters

# 保存原始的 JSON 编码器
original_dict_encoder = converters.encoders[dict]

# 自定义 JSON 编码器,支持更多数据类型
def custom_json_encoder(value, mapping=None):
    if isinstance(value, dict):
        processed_dict = {}
        for k, v in value.items():
            if isinstance(v, datetime):
                processed_dict[k] = v.isoformat()
            else:
                processed_dict[k] = v
        json_str = json.dumps(processed_dict)
        return original_dict_encoder(json_str, mapping)
    return original_dict_encoder(value, mapping)

# 替换默认的字典编码器
converters.encoders[dict] = custom_json_encoder
批量操作 JSON 数据

PyMySQL 支持批量插入和更新 JSON 数据,提高处理效率:

try:
    with connection.cursor() as cursor:
        # 批量插入 JSON 数据
        insert_sql = "INSERT INTO user_profiles (name, preferences) VALUES (%s, %s)"
        
        users = [
            ("Alice", {"theme": "light", "notifications": {"email": True}}),
            ("Bob", {"theme": "dark", "notifications": {"email": False, "push": True}}),
            ("Charlie", {"theme": "blue", "favorite_features": ["dashboard", "reports"]})
        ]
        
        cursor.executemany(insert_sql, users)
        connection.commit()
        
        # 批量更新 JSON 字段
        update_sql = "UPDATE user_profiles SET preferences = JSON_SET(preferences, '$.notifications.sms', false)"
        cursor.execute(update_sql)
        connection.commit()
finally:
    connection.close()

常见问题与解决方案

JSON 解码错误

当 JSON 数据格式不正确或包含不受支持的数据类型时,PyMySQL 可能会抛出解码错误。解决方法是使用 try-except 捕获错误,并实现自定义错误处理:

try:
    cursor.execute("SELECT id, problematic_json FROM data_table")
    for row in cursor:
        try:
            json_data = row['problematic_json']
            # 处理 JSON 数据
        except (ValueError, TypeError) as e:
            print(f"Error parsing JSON for id {row['id']}: {e}")
            fix_corrupted_json(cursor, row['id'])
except pymysql.Error as e:
    print(f"MySQL error: {e}")
性能优化

处理大量 JSON 数据时,可以通过以下方法优化性能:

  1. 创建 JSON 字段索引:对经常查询的 JSON 路径创建索引
  2. 部分提取:只获取需要的 JSON 字段,减少数据传输
  3. 批量操作:使用 executemany 减少网络往返
  4. 连接池:使用连接池减少连接开销
-- 创建 JSON 字段索引示例
ALTER TABLE user_profiles ADD INDEX idx_preferences_theme ((preferences->'$.theme'));

总结

PyMySQL 提供了强大而灵活的 JSON 数据处理能力,通过自动类型转换和与 MySQL JSON 函数的无缝集成,使得 Python 与 MySQL 之间的 JSON 数据交互变得简单直观。无论是存储简单的配置信息,还是处理复杂的嵌套 JSON 结构,PyMySQL 都能满足你的需求。

通过本文介绍的方法,你可以:

  • 使用 Python 字典和列表直接操作 MySQL JSON 数据
  • 利用 MySQL JSON 函数进行高效的查询和更新
  • 处理大型 JSON 数据和批量操作
  • 自定义 JSON 编码和解码逻辑
  • 优化 JSON 数据处理性能

要深入了解 PyMySQL 的 JSON 处理实现细节,可以查看 converters.py 源代码,该文件定义了所有数据类型的转换规则。更多 PyMySQL 使用示例可以参考官方文档。

掌握 PyMySQL 的 JSON 数据处理技巧,将帮助你在 Python 和 MySQL 开发中更灵活地应对复杂数据结构,构建更强大的应用程序。

目录

  1. PyMySQL JSON 数据处理:Python 与 MySQL 交互
  2. JSON 数据存储基础
  3. 基本数据插入
  4. 连接数据库
  5. 数据类型映射
  6. JSON 数据查询与解析
  7. 基本查询操作
  8. 使用 MySQL JSON 函数查询
  9. 高级 JSON 处理技巧
  10. 处理大型 JSON 数据
  11. 使用服务器端游标处理大型 JSON 数据
  12. 自定义 JSON 编码器和解码器
  13. 保存原始的 JSON 编码器
  14. 自定义 JSON 编码器,支持更多数据类型
  15. 替换默认的字典编码器
  16. 批量操作 JSON 数据
  17. 常见问题与解决方案
  18. JSON 解码错误
  19. 性能优化
  20. 总结

更多推荐文章

查看全部
  • AIGC时代Kubernetes企业级云原生运维实战:智能重构与深度实践指南
  • 医疗 AI 算法编程深度解析:败血症预测全流程总结
  • C++ 类与对象:封装特性实现与实战应用
  • 机器人送料机械手设计方案
  • GTC 2026 前瞻:Rubin 平台与 AI 工厂化演进
  • MySQL Explain 分析 SQL 执行计划
  • Android System WebView 详解与版本兼容性指南
  • C++ 类和对象:默认成员函数详解
  • 2025 信奥赛 C++ 提高组 CSP-S 复赛真题及题解:员工招聘
  • 自然语言处理在金融领域的应用与实战
  • OpenClaw Discord 机器人部署指南
  • 降低论文 AIGC 检测率的实用技巧与工具参考
  • Python PyCharm OpenCV 环境搭建与安装指南
  • 大模型学习进阶之路:五级晋级指南
  • ViewModel 中 StateFlow 与 SharedFlow 的选择策略及单元测试实践
  • Claude Code + GLM4.7 修复前端 Bug 的踩坑实录与经验总结
  • 基于 Jenkins 与 Gitea 的离线环境 CI/CD 自动化搭建指南
  • Spatial Joy 2025 全球 AR&AI 开发大赛参赛指南
  • 无人机 RemoteID 合规方案:ArduRemoteID 开源实现指南
  • Qwen-Image-Edit-2511 与 Stable Diffusion 图像编辑对比分析

相关免费在线工具

  • 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