PyMySQL 连接数据库报 KeyError ‘t_id‘?TaoToken 这样改通道让 Codex 查占位符

PyMySQL 连接数据库报 KeyError ‘t_id‘?TaoToken 这样改通道让 Codex 查占位符 一、PyMySQL 报 KeyError: t_id 到底在报什么如果你正在用 Python 写数据库插入逻辑执行到cursor.execute(sql, {...})时突然抛出KeyError: t_id第一反应往往是我字典里明明写了 t_id 啊。这个报错的迷惑性就在这里它看起来像字典缺键但真正的原因可能藏在 SQL 占位符、字典键名、甚至建表字符集里。本篇的场景非常具体用 PyMySQL 给t_user表执行 insertSQL 里写了%(t_id)s、%(t_name)s、%(t_age)s三个命名占位符参数字典也传了对应的键结果 traceback 停在pymysql/cursors.py的mogrify里直接KeyError: t_id。这类问题在 CSDN 上被问得很多但大多数回答只给一句检查字典键名没有把排查路径讲清楚。这篇用「排障」视角来写先在 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建一个 Key把 Codex 的 Base URL 指向https://taotoken.net/api然后把你的 SQL、参数字典和完整 traceback 一起贴给 Codex让它逐项核对占位符与字典键的对应关系。需要先说明的是TaoToken 只提供 Codex 可用的模型通道它不执行cursor.execute也不修改你的t_user表结构它做的是帮你把报错信息读透、把排查顺序理清。下面按问题定位 → 通道准备 → 配置 → 验证 → 常见错 → 后续六段展开每一步都可以直接复制。二、TaoToken 前置为什么排障要用它PyMySQL 的KeyError有一个特点Python 的字典查找失败和 SQL 占位符替换失败报的是同一个异常类型。你从 traceback 只能看到mogrify里query % self._escape_args(args, conn)这一行炸了但到底是字典少了键还是 SQL 里的占位符写成了别的名字光看这一行看不出来。这时候把三样东西一起交给 Codex 会高效很多完整的sql字符串包括%(t_id)s这种占位符写法传给execute的参数字典原文从Traceback到KeyError的完整堆栈Codex 通过 TaoToken 通道拿到这些内容后可以逐字符比对占位符名和字典键名指出是t_id写成了t_id啊还是 SQL 里多了一个空格导致占位符没被识别或者提醒你建表时字符集没设导致后续插入中文出问题。它不会替你去连数据库但能把哪一行、哪个键、哪个字符对不上讲清楚。TaoToken 在这里的角色是模型通道你给它一个 Key它让 Codex 能正常调用模型。它不碰你的 PyMySQL 连接也不碰你的表结构。三、可复制配置把 Codex 接到 TaoToken3.1 创建 Key打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册后在控制台创建 API Key。拿到形如YOUR_API_KEY的字符串先存好。3.2 配置 Codex 的 Base URLCodex 的配置里Base URL 填https://taotoken.net/api注意这里不带/v1。很多接入失败是因为多写了/v1或者少写了协议头。API 地址就是https://taotoken.net/api不要加 UTM 参数也不要拼别的路径。3.3 如果你用 CLI标题里涉及 CLI 的话可以用 TaoToken 的命令行工具npm i -g taotoken/taotoken taotoken cc -k YOUR_API_KEY -u https://taotoken.net/api -m MODEL_ID-k后面是你的 Key-u是 API 地址-m是你要用的模型 ID。这条命令跑通后Codex 就能通过 TaoToken 通道工作。3.4 把报错材料整理好在问 Codex 之前先把下面这段整理成一段文本不要只贴一行报错sql insert into t_user(t_id,t_name,t_age) values (%(t_id)s,%(t_name)s,%(t_age)s) cursor.execute(sql, {t_id: 3, t_name: 啊aaa, t_age: 10})再加上完整 tracebackTraceback (most recent call last): File E:\python_exercise\pythonDemo\test\Test.py, line 29, in module cursor.execute(sql, {t_id啊: 3, t_name: aaa, t_age: 10}) File E:\python\lib\site-packages\pymysql\cursors.py, line 146, in execute query self.mogrify(query, args) File E:\python\lib\site-packages\pymysql\cursors.py, line 125, in mogrify query query % self._escape_args(args, conn) KeyError: t_id把这两段一起发给 Codex让它做三件事比对占位符名与字典键名、检查 SQL 字符串里的空格和括号、判断是否与建表字符集有关。四、验证请求与成功结果配置好之后先做一次最小验证让 Codex 复述你贴的 SQL 和字典看它能不能准确指出t_id在字典里是否存在。一个典型的成功输出会是这样Codex 指出SQL 里占位符是%(t_id)s但参数字典里的键是t_id啊两者不相等所以mogrify在替换时找不到t_id抛出KeyError。它同时提醒即使键名改对了如果t_user表建表时没有指定CHARACTER SET utf8 COLLATE utf8_general_ci插入中文啊aaa时可能遇到编码问题建议在建表语句里显式加上字符集。如果 Codex 能给出这两点说明通道是通的模型也确实读到了你的报错材料。接下来你就可以按它的建议改字典键名再跑一次cursor.execute。改完后的正确写法sql insert into t_user(t_id,t_name,t_age) values (%(t_id)s,%(t_name)s,%(t_age)s) cursor.execute(sql, {t_id: 3, t_name: 啊aaa, t_age: 10})注意字典键必须是t_id不能是t_id啊也不能有多余空格。五、本篇常见错排查5.1 字典键名与占位符名不一致这是最直接的原因。%(t_id)s要求字典里有t_id这个键。如果写成t_id啊、tid、t_Id都会报KeyError。Python 字典键是大小写敏感的t_id和T_ID不是同一个键。5.2 SQL 字符串里的空格或换行%(t_id)s中间不能有空格。写成%( t_id )s或者%(t_id )sPyMySQL 解析占位符时会得到不同的名字导致找不到对应键。建议把 SQL 写成一行或者用三引号时注意不要在多行拼接处引入意外空格。5.3 建表字符集没设导致中文插入异常原文的解决方向提到建表时如果没有设置中文字符集数据库会按默认字符集建表插入中文可能出问题。建议建表时显式写create table t_user( t_id int(3), t_name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci, t_age int(3) );这样t_name字段明确使用 utf8插入啊aaa这类中文时不会因为字符集不匹配而报错。注意这解决的是编码问题不是KeyError本身但两者经常一起出现排查时不要漏掉。5.4 参数类型与占位符不匹配%(t_id)s里的s表示按字符串格式化。如果你传的是整数3而不是字符串3PyMySQL 通常也能处理但为了和占位符语义一致建议统一用字符串或统一用数字避免在mogrify阶段出现意外转换。5.5 把 Base URL 写成了带 /v1 的地址如果你在配置 Codex 时把 Base URL 写成https://taotoken.net/api/v1请求会失败。正确写法是https://taotoken.net/api不带/v1。这个错误和 PyMySQL 报错无关但会挡住你用 Codex 排障的通道所以单独列出来。六、语义一致的后续动作排障完成后如果你还想继续用 Codex 核对其他 SQL 或 Python 报错可以按下面的路径走需要创建或管理 Key去 API Keys 页面配合接入文档确认 Base URL 和模型 ID 的写法。想直接验证模型是否可用打开模型对话把一段最小复现的 SQL 和字典贴进去看它能不能指出键名差异。长期做编码和 Agent 任务考虑 Coding Plan把 Codex 的通道固定下来避免每次排障都重新配。TaoToken 在这里始终只做一件事给 Codex 提供可用的模型通道。它不执行cursor.execute不改t_user表结构也不替你连数据库。真正修好KeyError: t_id的是你把字典键名改对、把 SQL 占位符写对、把建表字符集设对。Codex 通过 TaoToken 通道帮你把这三件事看清楚剩下的改动在你自己的代码里完成。