新闻详情

新闻详情

首页 / 资讯中心 / 详情

Python pymysql 查询结果转 JSON 字符串:TaoToken 统一 Key 通道下的配置与验证

发布时间:2026/9/28 18:47:12来源:尧图网络
Python pymysql 查询结果转 JSON 字符串:TaoToken 统一 Key 通道下的配置与验证
1. 为什么 pymysql 查出来的数据不能直接 json.dumps你写了一个本地脚本或者用 Cline 这类 AI 工具生成了一个数据接口从 MySQL 里select出几行数据想直接json.dumps(results)返回给前端或写进文件结果报错TypeError: Object of type datetime is not JSON serializable或者Decimal is not JSON serializable。这不是你代码写错了而是 pymysql 返回的 Python 对象和 JSON 标准类型之间天然存在一道鸿沟。pymysql 默认把 MySQL 的字段映射成 Python 原生类型DATETIME/TIMESTAMP变成datetime.datetimeDECIMAL变成decimal.DecimalBIGINT在部分场景下变成int但超出 JS 安全整数范围TINYINT(1)变成bool。这些类型json.dumps一个都不认识。更隐蔽的坑是cursor.fetchall()返回的是元组列表字段名只存在于cursor.description里如果你直接序列化元组字段名全丢了前端拿到一堆没有 key 的数组根本没法用。还有一个新手经常忽略的点json.dumps默认ensure_asciiTrue中文会被转义成\u300a这种形式。数据本身没错但可读性极差调试时看着头疼接口返回给前端虽然能解析但日志里全是乱码一样的转义串。这篇就围绕「pymysql 查询结果转 JSON 字符串」这一件事把连接配置、字段名还原、自定义 JSONEncoder、中文处理、以及通过 TaoToken 统一 Key 通道做接口验证的完整链路讲清楚。适合刚入门 Python、正在写本地脚本或 AI 工具生成的数据接口的同学跟着做就能跑通。2. TaoToken 统一 Key 通道的前置准备在讲序列化之前先说清楚为什么这篇要提 TaoToken。你写的是一个数据接口脚本不管是本地跑还是给 Cline 这类 AI 编码工具调用最终都要有一个稳定的模型通道来做验证、调试或者生成代码。TaoToken 提供的是统一 Key 通道一个 Key 走通模型对话、Coding Plan、API 调用不用在多个平台之间来回切换配置。你需要先拿到 Key。打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后在控制台里创建 API Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API Keys 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。Key 拿到后先存好后面配置settings.json要用。这里要区分两个地址官网带 UTM 参数用于追踪来源API 端点统一用 https://taotoken.net/api 不加任何 UTM。你的脚本里请求模型接口时base_url 填https://taotoken.net/api即可。如果你只是想让 AI 帮你生成或补全 pymysql 序列化代码可以直接用模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 把报错信息贴进去让它给方案。如果你是在做长期编码、Agent 类项目建议看 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 额度模型更适合持续调用。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 配置细节以文档为准。3. pymysql 连接配置与字段名还原先解决最基础的一步把查询结果从元组变成带字段名的字典。很多人卡在这里是因为不知道cursor.description的结构。它是一个元组序列每个元素的第一位[0]就是字段名。你可以用cursor.description配合zip或者索引遍历来还原。下面是一段可复制的连接配置和字段名还原代码。连接参数用字典管理方便你替换成自己的库信息import pymysql import json from datetime import datetime, date from decimal import Decimal DB_CONFIG { host: 127.0.0.1, port: 3306, user: your_user, password: your_password, database: your_db, charset: utf8mb4, cursorclass: pymysql.cursors.DictCursor, # 关键直接返回字典 } def query_diaries(uid3, limit10): conn pymysql.connect(**DB_CONFIG) try: with conn.cursor() as cursor: sql select id, title, content, created_at, price from diaries where uid%s limit %s cursor.execute(sql, (uid, limit)) rows cursor.fetchall() return rows finally: conn.close()注意这里用了cursorclasspymysql.cursors.DictCursor。这是最省事的方案pymysql 会直接把每一行返回成{id: 1, title: ...}这样的字典字段名自动带上你不需要手动遍历cursor.description。如果你用的是默认的Cursor那就得自己写还原逻辑def rows_to_dict(cursor, rows): columns [desc[0] for desc in cursor.description] return [dict(zip(columns, row)) for row in rows]两种方式都行DictCursor更简洁手动还原更可控。我实测下来DictCursor在字段多的时候性能略低一点点但日常脚本完全无感优先用它。4. 自定义 JSONEncoder 处理 datetime 与 Decimal字段名解决了接下来是类型问题。datetime、date、Decimal这三类是报错重灾区。标准做法是继承json.JSONEncoder重写default方法遇到不认识的类型就转成字符串或数字。class MySQLJSONEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime): return obj.strftime(%Y-%m-%d %H:%M:%S) if isinstance(obj, date): return obj.strftime(%Y-%m-%d) if isinstance(obj, Decimal): # 金额类建议转字符串避免浮点精度丢失 return str(obj) if isinstance(obj, bytes): return obj.decode(utf-8, errorsreplace) if isinstance(obj, set): return list(obj) return super().default(obj)这里有个细节值得说Decimal转float还是str如果你做的是金额、价格类字段强烈建议转str。因为float(Decimal(19.90))可能变成19.9甚至19.899999999999999前端展示和后续计算都会出问题。转字符串最安全前端拿到后自己决定怎么处理。datetime的格式也要统一。如果你的接口要给前端用建议固定成%Y-%m-%d %H:%M:%S不要用isoformat()带T和时区偏移除非你明确需要。统一格式能省掉前端一堆解析逻辑。然后序列化的时候这样调用def to_json_string(rows): return json.dumps( rows, clsMySQLJSONEncoder, ensure_asciiFalse, # 中文不转义 indentNone, # 接口返回不要缩进省带宽 separators(,, :), )ensure_asciiFalse是中文可读的关键。不加这个参数《标题日记》会变成\u300a\u6807\u9898\u65e5\u8bb0\u300b。数据没错但日志和调试体验差很多。加上之后输出就是正常中文。5. settings.json 中 TaoToken 统一 Key 配置片段如果你用的是 Cline 这类 AI 编码工具或者你的脚本需要调用模型接口做验证settings.json里要配置 TaoToken 的统一 Key。下面是一个可复制的配置片段字段名以你实际使用的工具为准核心是base_url和api_key{ taotoken: { base_url: https://taotoken.net/api, api_key: sk-your-taotoken-key-here, model: claude-sonnet-4-20250514, timeout: 60, max_retries: 2 }, database: { host: 127.0.0.1, port: 3306, user: your_user, password: your_password, database: your_db, charset: utf8mb4 } }几个注意点。第一base_url用https://taotoken.net/api不要加 UTM 参数UTM 是给网页追踪用的API 端点加了反而可能出问题。第二api_key不要硬编码在提交到 Git 的文件里用环境变量或者.env读取。第三model字段填你实际要用的模型名具体可用模型以接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 为准。读取配置的代码大概长这样import json import os def load_settings(pathsettings.json): with open(path, r, encodingutf-8) as f: cfg json.load(f) # 优先用环境变量覆盖避免 Key 泄露 cfg[taotoken][api_key] os.getenv(TAOTOKEN_API_KEY, cfg[taotoken][api_key]) return cfg这样你在本地开发时把 Key 放环境变量配置文件里留个占位符提交代码就不会泄露。6. 运行验证从查询到 JSON 字符串的完整动作把前面的代码串起来写一个完整的验证脚本。假设你的diaries表有id、title、content、created_at、price五个字段其中created_at是DATETIMEprice是DECIMALimport pymysql import json from datetime import datetime, date from decimal import Decimal class MySQLJSONEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime): return obj.strftime(%Y-%m-%d %H:%M:%S) if isinstance(obj, date): return obj.strftime(%Y-%m-%d) if isinstance(obj, Decimal): return str(obj) return super().default(obj) def main(): conn pymysql.connect( host127.0.0.1, port3306, useryour_user, passwordyour_password, databaseyour_db, charsetutf8mb4, cursorclasspymysql.cursors.DictCursor, ) try: with conn.cursor() as cursor: cursor.execute( select id, title, content, created_at, price from diaries where uid%s limit %s, (3, 10), ) rows cursor.fetchall() json_str json.dumps(rows, clsMySQLJSONEncoder, ensure_asciiFalse) print(json_str) # 验证能否反序列化回来 parsed json.loads(json_str) assert isinstance(parsed, list) assert parsed[0][title] is not None print(验证通过共, len(parsed), 条记录) finally: conn.close() if __name__ __main__: main()运行后你应该看到类似这样的输出[{id:1,title:《标题日记》完成输入功能,content:null,created_at:2025-01-15 09:30:00,price:19.90},{id:2,title:睡了一天有些累,content:null,created_at:2025-01-15 10:00:00,price:0.00}]中文正常显示datetime变成了标准字符串Decimal变成了字符串字段名都在。最后用json.loads反序列化一遍确认输出是合法 JSON这一步很重要能提前发现编码或类型问题。如果你要把这个 JSON 字符串通过 TaoToken 的模型接口做进一步处理比如让模型分析数据可以在脚本里加一段请求import requests def ask_model(json_str, api_key): resp requests.post( https://taotoken.net/api/v1/chat/completions, headers{Authorization: fBearer {api_key}, Content-Type: application/json}, json{ model: claude-sonnet-4-20250514, messages: [{role: user, content: f分析以下数据{json_str}}], }, timeout60, ) return resp.json()请求地址用https://taotoken.net/api作为 base具体路径以文档为准。验证模型对话效果可以直接在 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里试。7. 本篇常见错误排查报错一TypeError: Object of type datetime is not JSON serializable原因是没有用自定义 Encoder或者 Encoder 里没处理datetime。检查json.dumps是否传了clsMySQLJSONEncoder以及default方法里isinstance判断是否覆盖了datetime。注意datetime是date的子类判断顺序要先datetime后date否则datetime会被date分支截胡丢失时分秒。报错二TypeError: Object of type Decimal is not JSON serializable同上Encoder 里加Decimal分支。如果你不想写 Encoder也可以在 SQL 里用CAST(price AS CHAR)把DECIMAL转成字符串但这样字段类型信息就丢了不推荐。报错三JSON 里字段名丢失只有数组你用的是默认Cursorfetchall()返回元组直接json.dumps就变成数组了。解决方式二选一用DictCursor或者手动用cursor.description还原字段名。手动还原的代码在第三节给了。报错四中文变成\uXXXX转义json.dumps默认ensure_asciiTrue。加上ensure_asciiFalse即可。注意这个参数只影响输出不影响数据本身。报错五json.loads报Expecting value或解析失败检查你的 JSON 字符串里有没有NaN、Infinity这类非标准值。MySQL 的FLOAT字段如果存了异常值json.dumps默认会输出NaN这不是合法 JSON。可以在 Encoder 里把float(nan)转成None或者用json.dumps(..., allow_nanFalse)让它直接报错提前暴露问题。报错六连接超时或Access denied检查DB_CONFIG里的 host、port、user、password、database 是否和实际一致。charset建议固定utf8mb4避免中文和 emoji 乱码。如果 Key 相关配置有问题去 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 确认 Key 状态接入细节看文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。8. 继续把这条链路用起来到这里pymysql 查询结果转 JSON 字符串的核心链路已经跑通了连接配置、字段名还原、自定义 Encoder、中文处理、运行验证、错误排查每一步都有可复制的代码。你可以直接把第六节的完整脚本拿去改表名和字段名五分钟就能跑起来。如果你后续要做的是长期编码项目或者让 AI Agent 持续帮你生成和调试这类数据接口建议把 TaoToken 的 Coding Plan 配起来 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 统一 Key 通道省掉多平台切换的麻烦。日常快速验证模型输出用模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 就够了。控制台和 Key 管理分别在 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 和 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。最后留一个实用技巧把MySQLJSONEncoder单独放到一个utils/json_encoder.py文件里所有脚本共用。下次遇到datetime报错直接from utils.json_encoder import MySQLJSONEncoder不用每次重写。这个类我用了两年多覆盖了 MySQL 常见类型的 95% 场景剩下 5% 是GEOMETRY和JSON字段遇到再单独处理就行。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

CH55xDuino编译报错排查:sdcc.sh syntax error修复指南 2026/9/28 19:45:45

CH55xDuino编译报错排查:sdcc.sh syntax error修复指南

最近在折腾 CH55xDuino 编译报错的事,差点被一个几行的小脚本劝退。板子是 WCH 的 CH552,二十条腿的单片机,自带USB控制器,价格又便宜,本来想拿它在 Arduino IDE 里点点灯、模拟个键盘鼠标,结果第一次编译就…

阅读更多 →
STM32开发资料地图:官方文档+社区资源+开源例程的实战指南 2026/9/28 19:45:45

STM32开发资料地图:官方文档+社区资源+开源例程的实战指南

直接说结论:想给STM32找一个靠谱的开发参考方案,目前国内最好的路径是"官方文档打底 社区资源补细节 开源硬件厂商例程做模板"。这篇文章我把自己这几年找资料、筛资源、避坑的完整思路整理出来,按场景拆开讲,希望对正…

阅读更多 →
水位传感器原理与STM32实战:从ADC读取到滤波阈值判断 2026/9/28 19:45:45

水位传感器原理与STM32实战:从ADC读取到滤波阈值判断

传感器入门最常见的误区,就是把“水位传感器”想得太高级,觉得它真能像尺子一样告诉你水位现在是多少厘米。实际上——起码是这种十几块钱的模块——它连“称重式”都算不上,本质就是一个会随湿度变化阻值的可变电阻。这篇文章我就拿它配合ST…

阅读更多 →
嵌入式配置范式升级:从寄存器编程到语义驱动开发 2026/9/28 19:45:44

嵌入式配置范式升级:从寄存器编程到语义驱动开发

1. 这不是营销话术,是嵌入式工程师熬了三年夜才等来的实打实改进“嵌入式开发者的福音”——看到这标题,我下意识摸了摸自己右眼角那道浅浅的细纹。不是夸张,去年做一款工业温控模块时,光是调试UART波特率漂移问题就连续改了17版固…

阅读更多 →
STM32开发调试避坑指南:从Keil环境到时钟、串口与外设实战复盘 2026/9/28 19:45:44

STM32开发调试避坑指南:从Keil环境到时钟、串口与外设实战复盘

前阵子帮一个学生查所谓的"按键控制LED"小项目,代码翻来覆去看了好几遍,GPIO方向、上下拉、扫描逻辑全都没问题,可LED偏偏不按预期亮灭。最后我拿示波器去戳了一下外部晶振引脚,发现8MHz晶振根本没起振,整个…

阅读更多 →
STM32F103C8T6音频信号分析仪:从ADC采样到OLED频谱显示 2026/9/28 19:45:37

STM32F103C8T6音频信号分析仪:从ADC采样到OLED频谱显示

最近把用STM32F103C8T6实现的音频信号分析仪项目完整整理了一遍:Proteus仿真跑通,软件程序源代码调稳了,OLED12864走SPI通讯实时绘制频谱柱状图。整套东西做下来最大的感受是“麻雀虽小五脏俱全”,一块几十块钱的单片机演完了信号…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉