1. 为什么查 MySQL 总拿到元组而不是键值对用 Python 连 MySQL 查数据很多人第一次跑出来的结果长这样(1, alice, aliceexample.com)。字段顺序全靠脑记一旦表结构改了列顺序row[2]取到的可能就不是邮箱而是手机号排查起来非常费劲。你真正想要的是{id: 1, username: alice, email: aliceexample.com}这种键值对形式用字段名取值代码可读性和抗变更能力都强一个档次。这篇就围绕「Python 查询 MySQL 以键值对方式返回」这件事展开先讲清楚游标类型怎么决定返回结构再给出一份可复制的连接参数与结果转换代码最后把 TaoToken 统一 Key 的settings.json配置骨架接进来演示一次真实查询验证动作。适合刚接触 Python MySQL、想把查询结果直接当字典用的同学也适合已经在用 ORM、但偶尔要写原生 SQL 的开发者。核心结论先放这里键值对返回不是靠fetchall()本身而是靠游标类型。MySQLdb 用DictCursorPyMySQL 用pymysql.cursors.DictCursormysql-connector 用dictionaryTrue。选对游标fetchone()和fetchall()出来的就是字典或字典列表。2. TaoToken 统一 Key 与 settings.json 配置骨架在写数据库代码之前先把外部 API 通道的配置理顺。TaoToken 提供统一 Key 和统一 API 入口把模型调用、编码辅助这类请求收敛到一个地址和一个密钥上配置文件里不用散落一堆不同厂商的 key。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。我习惯把这类配置集中放在项目根目录的settings.json里数据库连接和 API 通道分开两个块互不干扰。下面这份骨架你可以直接抄把占位值换成自己的即可{ database: { host: 127.0.0.1, port: 3306, user: app_user, password: your_db_password, database: demo, charset: utf8mb4 }, taotoken: { base_url: https://taotoken.net/api, api_key: sk-你的统一Key, default_model: claude-sonnet-4-5, timeout: 60 } }这里有几个点值得说明。charset一定写utf8mb4不然中文和 emoji 容易变问号。taotoken.base_url只写到/api具体路径由 SDK 或请求拼接不要自己乱加后缀。api_key建议从环境变量注入别硬编码进仓库后面第 3 节会给读取方式。统一 Key 的申请入口在控制台的 API Keys 页面https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。拿到 key 后填进settings.json的api_key字段即可。如果你后续要做长期编码或 Agent 类任务可以了解 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。注意settings.json里出现明文密钥时务必把该文件加入.gitignore或者改用os.environ读取避免密钥进版本库。3. 可复制配置连接参数与键值对游标写法这一节是全文重点直接给能跑的代码。先装驱动PyMySQL 是纯 Python 实现安装无编译依赖推荐新手用pip install pymysql然后写一个读取配置 建立连接 键值对查询的完整脚本。注意游标那行cursorclasspymysql.cursors.DictCursor它就是键值对的开关import json import os import pymysql # 读取 settings.json密钥优先走环境变量 with open(settings.json, r, encodingutf-8) as f: cfg json.load(f) db_cfg cfg[database] db_cfg[password] os.environ.get(DB_PASSWORD, db_cfg[password]) conn pymysql.connect( hostdb_cfg[host], portdb_cfg[port], userdb_cfg[user], passworddb_cfg[password], databasedb_cfg[database], charsetdb_cfg[charset], cursorclasspymysql.cursors.DictCursor, # 关键返回字典 ) try: with conn.cursor() as cursor: cursor.execute(SELECT id, username, email FROM users LIMIT 5) rows cursor.fetchall() for row in rows: print(row[id], row[username], row[email]) finally: conn.close()如果你用的是 MySQLdb写法几乎一样只是游标类换成MySQLdb.cursors.DictCursor连接用MySQLdb.connect(...)。用 mysql-connector-python 的话是在connect()里加dictionaryTrue不用指定游标类。三种驱动对照如下驱动键值对开关取值方式PyMySQLcursorclasspymysql.cursors.DictCursorrow[字段名]MySQLdbcursorclassMySQLdb.cursors.DictCursorrow[字段名]mysql-connectorconnect(..., dictionaryTrue)row[字段名]有时候你不想改游标类型只想把已有的元组结果转成字典可以用cursor.description拿字段名再zipwith conn.cursor() as cursor: cursor.execute(SELECT id, username, email FROM users LIMIT 5) cols [d[0] for d in cursor.description] rows [dict(zip(cols, r)) for r in cursor.fetchall()] print(rows[0][username])这种转换方式适合临时场景但字段多的时候不如直接用 DictCursor 干净。另外提醒一句fetchone()在 DictCursor 下返回单个字典查不到数据时返回None取值前记得判空。4. 验证请求跑一次查询看键值对结果配置写完跑一次验证动作确认链路通。先准备一张测试表和几条数据CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50), email VARCHAR(100) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; INSERT INTO users (username, email) VALUES (alice, aliceexample.com), (bob, bobexample.com);执行第 3 节的脚本预期输出类似1 alice aliceexample.com 2 bob bobexample.com如果打印出来是这种带字段名的结构说明键值对返回已经生效。再补一个单条查询的验证确认fetchone()行为with conn.cursor() as cursor: cursor.execute(SELECT id, username FROM users WHERE username%s, (alice,)) row cursor.fetchone() print(type(row), row) # 预期class dict {id: 1, username: alice}看到type是dict键值对查询就算跑通了。这里顺带说下参数化查询execute的第二个参数用元组传值别用字符串拼接能防 SQL 注入。占位符 PyMySQL 和 MySQLdb 都用%s不是?。如果你还想顺手验证 TaoToken 通道是否可用可以用统一 Key 发一次模型对话请求确认settings.json里的base_url和api_key配置正确。模型对话入口https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。接入细节可查文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。5. 本篇常见错排查报错ModuleNotFoundError: No module named pymysql驱动没装或装到了别的 Python 环境。用python -m pip install pymysql明确指定解释器再python -c import pymysql; print(pymysql.__version__)确认。结果还是元组不是字典八成是游标类没生效。检查connect()里cursorclass是否拼写正确或者你是不是在conn.cursor()时又覆盖了游标类型。mysql-connector 用户检查dictionaryTrue有没有漏。KeyError: username字段名对不上。DictCursor 的键是 SQL 里SELECT的列名或别名SELECT username AS name之后就得用row[name]。大小写敏感取决于系统建议统一小写。中文乱码连接参数charset没设成utf8mb4或者表本身不是这个字符集。两边都要对齐。pymysql.err.OperationalError: (2003, ...)连不上数据库。先确认 host、port 可达再确认用户有远程访问权限本地测试用127.0.0.1比localhost更少踩 socket 的坑。settings.json读取报JSONDecodeError文件里有注释或尾逗号。JSON 标准不支持注释删掉再试或者改用json5解析。密钥泄露风险api_key和数据库密码别写死在代码里用环境变量或密钥管理服务。提交前git diff扫一眼。6. 把配置和查询固化下来键值对查询这件事一旦游标类型选对剩下的就是工程习惯问题。我的做法是把数据库连接封装成一个get_conn()函数settings.json只放非敏感默认值密码和统一 Key 走环境变量脚本里统一with conn.cursor() as cursor管理资源。这样无论是写报表脚本还是接进服务返回的都是字典下游处理不用再关心列顺序。TaoToken 的统一 Key 在这里的价值是外部 API 通道和数据库配置放在同一份settings.json里管理换环境只改一个文件不用满项目找 key。API Keys 管理页在 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。先把第 3 节脚本跑通再按第 4 节验证一次键值对查询就彻底落地了。
企业数字化 ERP 产品动态
相关推荐
从源码构建 ramsey/uuid 官方文档:Sphinx 环境搭建、依赖解析与本地渲染完整指南 从源码构建 ramsey/uuid 官方文档:Sphinx 环境搭建、依赖解析与本地渲染完整指南 【免费下载链接】uuid :snowflake: A PHP library for generating universally unique identifiers (UUIDs). 项目地址: https://gitcode.com/gh_mirrors/uui/uuid
本文是一份… · 2026/9/23 11:41:48
我真的会编程吗?用 TaoToken 统一 Key 打通 Cline 与 CC Switch 的配置验证 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/23 11:41:48
yifang面试突击:5道高频题拆解与新手避坑指南 yifang面试突击:5道高频题拆解与新手避坑指南 刚刷完yifang的语法文档,觉得自己能上手了?别高兴太早。一进入真实项目,你会发现变量命名混乱、生命周期管理失控、状态同步报错频发。这就是典型的 学会语法却不知怎么搭项目 。… · 2026/9/23 11:41:48
开放式代码评审:从流程管控到团队协作的实践指南 1. 为什么我坚持把代码评审做成“开放式”的做了十多年开发,带过团队,也混过开源社区,我越来越确定一件事:代码评审(Code Review)这件事,最大的敌人不是技术难度,而是“封闭”。很多… · 2026/9/23 12:15:59
微信支付商户号注册全攻略:从材料准备到核心配置一步不漏 做个支付功能最让人头疼的其实不是写代码,而是还没开始写代码就得先过“注册商户号”这一关。我自己在做在线支付系列的时候,前面几篇都在讲支付的整体流程、下单逻辑、回调签名这些技术细节,但真到了要联调微信支付接口的时候才发现——没有… · 2026/9/23 12:15:59
FTP断点续传与断点上传源码解析:REST/APPE命令实战 简介:这是一份面向Linux网络编程学习者与课程设计者的FTP完整实现方案,基于C/S模式与socket编程,覆盖客户端与服务端双端代码,可帮助读者理解文件传输协议的核心机制与工程落地方式。压缩包共5个文件,以3个C源文件为主… · 2026/9/23 12:15:59
5个代码片段拆解网络安全保护等级实战逻辑 5个代码片段拆解网络安全保护等级实战逻辑 学会语法却不知怎么搭项目,这是无数开发者卡在入门期的死结。你背熟了Python的 list 和 dict ,Java的 ArrayList 和 HashMap… · 2026/9/23 12:15:59
Java构建台球赛事管理系统:从报名到分组的全流程数字化 1. 项目背景与核心价值台球作为一项广受欢迎的室内运动,近年来在各类业余赛事和俱乐部活动中热度持续攀升。但传统赛事报名管理往往面临诸多痛点:纸质登记易出错、电话报名效率低、微信群接龙信息混乱、Excel表格版本冲突等。作为一名长期参与业余台球赛… · 2026/9/23 12:15:52
GitHub热词榜深度解析:从访问故障到新手实战指南 今天的 GitHub 热词榜很有意思,从“github打不开”“github使用教程”到一堆英文项目名,几乎每个词都在说同一件事:越来越多人想用 GitHub,却被第一公里拦住了。我每次刷榜单最关心的不是某个词涨了多少,而是词和词连起… · 2026/9/23 12:15:52
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29