1. 一次 mysql-connector-python 连接 MySQL 的小翻车手边有个查询任务要连内网的 MySQL 实例跑一条 select。代码不复杂用 mysql-connector-python 就够了。可问题恰恰出在“不复杂”上主机、端口、用户名、密码、库名、字符集六个参数只要错一个报错就千奇百怪。常见的就有Access denied、Unknown database还有一种最让人摸不着头脑的Authentication plugin caching_sha2_password cannot be loaded。网上搜到的示例代码大多是这么写的import mysql.connector conn mysql.connector.connect( host10.214.168.25, port3306, useruser, passwordpassword, databasetest ) cursor conn.cursor() cursor.execute(select * from test t limit 2) result cursor.fetchall() if result: print(len(result)) for r in result: print(r) else: print(result is % % result)这段代码本身没问题但实际跑起来你可能要面对的是本地 Python 版本和 MySQL 服务端的认证插件不匹配或者数据库地址不在你能访问的网络里又或者你手上根本没有可用的测试账号。更麻烦的是当你想让 AI 帮你改这个脚本时AI 代码生成工具又要求你先把自己的 API Key、模型、Base URL 都配置好。如果还在用官方额度或者多个 Key 来回切光是“让工具能跑起来”就要花掉不少时间。这次我直接把 Codex 接到了 TaoToken 上。TaoToken 是一个统一 API 接入通道注册、创建 Key、查看模型广场都在官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 上完成。之后把 Base URL 填成 https://taotoken.net/apiCodex 就能按我指定的模型来生成和解释 Python 代码。本文就用 mysql-connector-python 这个例子把从配置到验证的完整路径走一遍。2. 先把 TaoToken 的 Key 和 Base URL 拿到手2.1 注册并创建 API Key这一步类似以前在云厂商控制台“申请密钥”的流程只不过现在都收敛到 TaoToken 一个地方。打开 TaoToken注册登录后进入控制台里的 API Keys 页面创建一个 Key。创建出来的 Key 是一串较长的字符串。注意它只在创建那一刻完整显示一次后续就看不到了。为了安全也为了对照本文示例我建议先把它复制到本地临时文件命名成YOUR_API_KEY那样的占位符待会儿填配置时直接粘。这里有个容易混淆的点官网域名是taotoken.net但填进 Codex 或任何 AI 编程工具的 Base URL是https://taotoken.net/api不是带www的官网首页也不是https://taotoken.net/v1。末尾不要加/v1。我一开始也差点犯这个错在工具里配成/v1/api结果请求直接 404。2.2 在模型广场确认模型 IDTaoToken 的模型广场会列出当前可用的模型 ID。不要凭记忆或者网上的旧教程填一堆看起来很新、实际不存在的模型名。每个模型 ID 以模型广场当时列表为准。这也是为什么我建议先把官网打开放旁边硬编码模型 ID 是最容易踩的坑之一。模型名带版本后缀更新一两次就变了你写死之后下次再用就报model not found。3. 把 Codex 指到 TaoToken3.1 Codex 的配置文件里加一个 model_providerCodex 的配置在用户目录下的~/.codex/config.toml。如果你之前没有编辑过先打开这个文件或者新建它。这里不涉及 Claude Code 的 ANTHROPIC_* 环境变量Codex 有自己的一套配置。我们添加一个自定义的 provider名字随便起比如taotokenmodel_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api api_key_env_var TAOTOKEN_API_KEY wire_api responses然后设置环境变量TAOTOKEN_API_KEY值就是你在官网创建的那把YOUR_API_KEY。在 Linux/macOS 下可以写进~/.bashrc或~/.zshrcexport TAOTOKEN_API_KEYYOUR_API_KEYWindows 用户就在系统环境变量里新增一条。3.2 设置 Codex 的模型模型 ID 写在~/.codex/config.toml里例如model 你的模型ID具体值去 TaoToken 模型广场 查。不要照抄别人的截图因为模型列表会更新。配置完成后可以在终端里跑一条最简单的命令验证连通性codex exec 11如果返回结果正常说明 Codex 已经通过 TaoToken 通道调到了模型。如果这一步报 401大概率是 API Key 没写对如果报 404大概率是 Base URL 末尾多了/v1或者模型 ID 不存在。4. 让 Codex 生成 mysql-connector-python 代码并本地执行4.1 把需求描述清楚让 Codex 写连接代码现在回到最初的业务场景。我想让 Codex 帮我生成一段 mysql-connector-python 连接 MySQL 的代码要求是读取 test 表前两行打印行数和每一行内容。我在 Codex 里输入用 mysql-connector-python 连接 MySQLhost 是 10.214.168.25端口 3306用户名 user密码 password数据库 test字符集 utf8。连接后执行 select * from test limit 2用 fetchall 拿结果打印结果行数和每条记录。注意参数要写在 config 字典里避免散落。Codex 返回的代码与原文思路一致但更完整一些import mysql.connector config { host: 10.214.168.25, user: user, password: password, port: 3306, database: test, charset: utf8 } conn mysql.connector.connect(**config) cursor conn.cursor() cursor.execute(select * from test t limit 2) result cursor.fetchall() if result: print(fresult len is {len(result)}) for r in result: print(r) else: print(result is % % result) cursor.close() conn.close()这里注意几个细节连接成功之后cursor用完顺手关掉conn也要在最后关。很多新手只写前半段不写关闭开发环境无所谓但要放到定时任务里就会累计连接数。4.2 在本地执行把结果贴回对话Codex 生成代码后不要让它直接去连你的数据库。Codex 运行在你的开发机或沙箱里不一定能访问到你内网的 MySQL。更稳妥的做法是把这段代码保存为test_conn.py在你自己能访问 MySQL 的那台机器或本地环境执行python test_conn.py执行结果可能是这样result len is 2 (1, Alice, 25) (2, Bob, 30)如果看到行数和记录都正常打印说明两件事同时成功了mysql-connector-python 的脚本能跑通Codex 经由 TaoToken 的 API 调用也成功完成。因为 Codex 只有在模型正常返回、Token 被正常消耗的情况下才能把这段完整代码交给你。4.3 让 Codex 帮忙解释查询结果的数据类型有时候我们不只是想拿到结果还想知道结果里每个元素的类型。原文里有过这样的需求打印result的长度和类型再打印每一项的类型。把需求给 Codex它会生成类似这样的代码cursor.execute(select * from test t where uuid %s, (00262732-d108-4a20-8af6-d1b4c3c4db6d,)) result cursor.fetchall() if result: print(result len is %s, result type is %s % (len(result), type(result))) for r in result: print(r) for item in r: print(item is %s, item type is %s % (item, type(item))) else: print(result is % % result)这里参数化查询用%s占位符而不是自己拼字符串这一点在原文里也有体现。Codex 很清楚这种安全写法的价值哪怕你不特别提醒它它也会用参数化查询。我把这段代码同样保存到本地执行。输出会显示result type is class list每条记录是class tuple记录里的字段可能是str、int或datetime等类型。这个信息对于后续处理很有用尤其是你要把结果转成 DataFrame 或者 JSON 时。5. 报错对照最常见的四类问题和处理方式5.1Access denied for user user...这个报错说明用户名或密码错误也可能是允许登录的来源地址不对。Codex 生成的代码不会主动帮你解决账号权限问题它只能保证语法正确。解决办法是在 MySQL 服务端确认账号和授权SELECT user, host, plugin FROM mysql.user WHERE user user;这一步请你在自己的数据库客户端或 SQL 命令行里执行然后根据结果去调整 Python 脚本里的密码或者给账号加权限。5.2Authentication plugin caching_sha2_password cannot be loadedMySQL 8.0 默认认证插件是caching_sha2_password如果你的 Python 环境里 mysql-connector-python 版本较旧就可能不识别。此时让 Codex 帮你查看当前驱动版本python -c import mysql.connector; print(mysql.connector.__version__)如果版本过旧升级它pip install --upgrade mysql-connector-python我建议不要轻易去修改 MySQL 用户的插件为mysql_native_password除非那台数据库是你自己的测试环境。生产环境尽量升级驱动而不是降低安全标准。5.3Unknown database test这个好办确认库里有没有这张表、库名是否正确。可以用 MySQL 客户端先看一眼SHOW DATABASES LIKE test;如果数据库不存在就说明你的连接参数里 database 写错了或者需要先建库。5.4Name or service not known如果你把 host 写成了域名而本机 DNS 解析不了就会看到这个错。把它换成 IP 地址或者在/etc/hosts里加上映射。Codex 生成代码时只会按你给的 host 来写所以这种问题要去你的网络环境里排查。5.5 这些报错和 TaoToken 有什么关系严格来说上面这些错都是 MySQL 侧的和 API 通道无关。你可能会想既然 Codex 都接到 TaoToken 了为什么还要我手动排查因为 Codex 只是帮你写代码、改代码的工具TaoToken 只是让 Codex 能用上合适模型的通道。真正连接 MySQL 的进程是 Python 脚本跑在你自己机器上。所以代码执行过程中出现的连接错、认证错、网络错都需要你以人肉身份介入再把报错贴回给 Codex。这时候 Codex 的价值是你把上面五类报错的原样输出贴给它它能判断是密码、插件、还是库名问题并给出对应的修改建议。它不会骗你说“我已经帮你连上数据库了”因为它根本没有你的网络路径。6. 跑通之后去控制台对一下这次调用代码在本地执行完毕结果行数和记录都正常打印这时候可以回官网看看刚才的调用是否被计入用量。打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end进入控制台的用量页面应该能看到一次完整的请求记录包括模型 ID、Token 消耗量和请求时间。如果你订阅了 Coding Plan还可以确认这次 Codex 对话消耗的是套餐额度而不是单独按次扣费。查用量的动作一定要做尤其是刚开始接入时它能帮你确认 Base URL 没有配错也让你对一次 select 脚本的对话大概消耗多少 Token 有个体感。如果后续还要在多个模型之间切换模型对话页也是一个很好的验证入口。你可以先在 TaoToken 模型对话 里用同一把 Key 发一条测试消息确认模型 ID 和 Base URL 没填错再回到 Codex 里继续干活。Key 的统一管理在 控制台 API Keys 里如果发现 Codex 偶发 401先进去检查 Key 是不是过期或被重新创建过。Claude Code 和 Codex 的接入方式虽然不同但原理相通官网只负责拿 Key 和看用量工具里填的地址永远是 https://taotoken.net/api。等到下次再写类似的 MySQL 查询脚本你就不用从零教 AI 了——把配置固化在~/.codex/config.toml里让它直接给出一版标准连接代码本地跑一次验证结果即可。这样真正花在数据库访问上的时间就从“配环境 调试”变成了“写需求 看结果”。