
1. 为什么 pymysql 项目需要一个统一的 Key 通道如果你写过 Python3 连 MySQL 的脚本大概率用过 pymysql 这个库。它轻量、纯 Python、装完就能用pymysql.connect(host..., user..., password...)一行就能把数据库连起来。但真正把项目跑起来之后麻烦往往不在 SQL 语法上而在「配置散落」这件事上数据库地址写在db.py里模型调用的 Key 写在另一个llm.py里测试环境一套、本地一套改一个参数要翻三四个文件还容易把密钥提交到 Git。这篇要解决的就是这个场景Python3 项目用 pymysql 连数据库的同时把模型/API 的 Key 和通道统一交给 TaoToken 管理用一个settings.json骨架把数据库连接参数和 API 通道配置收拢到一处。适合正在写 Python 后端、数据脚本、或者带 AI 能力的自动化工具的同学尤其是那种「数据库 大模型调用」混在一个项目里的情况。我会先给一份可直接复制的settings.json骨架再给 pymysql 的连接参数示例然后演示一次真实的连接报错排查过程最后确认通道可用。全程本地可跟做不需要复杂环境。TaoToken 在这里扮演的角色是「统一 Key/API 通道」你不用在代码里硬编码各家模型的地址和密钥而是通过一个统一的 API 入口https://taotoken.net/api来调用配置项集中管理。数据库那边 pymysql 照常连你的 MySQL两边互不干扰但配置风格保持一致。2. TaoToken 前置准备拿到 Key 与确认通道在写settings.json之前先把通道准备好。这一步很快但顺序别搞反否则后面排查报错时会分不清是配置问题还是 Key 问题。首先打开官网了解通道能力注册后在控制台创建 API Key。整个流程是官网 → 控制台 → API Keys → 创建。创建出来的 Key 一般形如sk-xxxx复制下来后面填进settings.json。官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content控制台创建/管理 Keyhttps://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 基础地址是https://taotoken.net/api注意这个地址不带任何查询参数代码里直接用它作为 base_url 即可。如果你后面要接 Claude Code 这类编码工具可以看 https://taotoken.net/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 如果是长期跑编码任务或 Agent建议了解 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。注意Key 只显示一次创建后立刻复制保存。不要把它写进会提交到 Git 的文件里后面我会用环境变量兜底。拿到 Key 之后先别急着写业务代码用一条最简单的请求确认通道是通的。这一步能帮你把「Key 问题」和「代码问题」提前分开。3. settings.json 可复制骨架与 pymysql 连接参数现在进入正题。我习惯把配置拆成两块database管 pymysqltaotoken管 API 通道。这样即使项目里同时有数据库和模型调用配置也在一处改起来不慌。先看settings.json骨架直接复制即可{ database: { host: 127.0.0.1, port: 3306, user: root, password: your_db_password, db: pikachu, charset: utf8mb4, cursorclass: DictCursor, connect_timeout: 5 }, taotoken: { base_url: https://taotoken.net/api, api_key: sk-替换成你的Key, model: gpt-4o-mini, timeout: 30 } }几个参数说明一下避免你照抄后踩坑参数作用建议值charset字符集utf8mb4比utf8更全能存 emojicursorclass游标返回形式DictCursor返回字典字段名可读connect_timeout连接超时秒数5 秒避免卡死base_urlTaoToken API 入口固定https://taotoken.net/apitimeout请求超时30 秒模型调用别设太短然后写一个读取配置的工具函数把settings.json加载进来并支持用环境变量覆盖 Key这样本地调试方便也不怕误提交import json import os def load_settings(pathsettings.json): with open(path, r, encodingutf-8) as f: cfg json.load(f) # 环境变量优先避免把 Key 写死在文件里 env_key os.getenv(TAOTOKEN_API_KEY) if env_key: cfg[taotoken][api_key] env_key return cfg接着是 pymysql 的连接封装。注意cursorclass在 JSON 里是字符串代码里要映射成真正的类import pymysql from pymysql.cursors import DictCursor def get_conn(cfg): db cfg[database] cursor_map {DictCursor: DictCursor} return pymysql.connect( hostdb[host], portdb[port], userdb[user], passworddb[password], dbdb[db], charsetdb[charset], cursorclasscursor_map.get(db.get(cursorclass), DictCursor), connect_timeoutdb.get(connect_timeout, 5), )这样一套下来数据库连接参数和 TaoToken 通道配置都在settings.json里代码只负责读。你换环境时只改 JSON不动 Python。4. 验证请求连库 通道双确认配置写好了得验证两件事pymysql 能不能连上库TaoToken 通道能不能通。我一般分两步走先库后通道出问题好定位。先验证数据库连接跑一个show databases看看from settings_loader import load_settings, get_conn cfg load_settings() conn get_conn(cfg) try: with conn.cursor() as cur: cur.execute(show databases;) rows cur.fetchall() print(数据库列表:, rows) finally: conn.close()如果打印出数据库列表说明 pymysql 这边没问题。注意这里用了with conn.cursor()会自动关闭游标比手动close()省心。再验证 TaoToken 通道。用requests发一条最小请求确认 Key 和 base_url 都对import requests def check_taotoken(cfg): tk cfg[taotoken] url tk[base_url].rstrip(/) /v1/chat/completions headers { Authorization: fBearer {tk[api_key]}, Content-Type: application/json, } payload { model: tk[model], messages: [{role: user, content: ping}], max_tokens: 8, } resp requests.post(url, headersheaders, jsonpayload, timeouttk[timeout]) print(状态码:, resp.status_code) print(返回:, resp.text[:200]) check_taotoken(cfg)状态码 200 且返回里有内容说明通道可用。如果返回 401多半是 Key 错了返回 404检查 base_url 有没有多写斜杠或路径。这一步跑通你的本地配置就算完成了。想更直观地验证模型是否正常响应也可以直接在模型对话页面手动发一条消息对比https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。5. 本篇常见报错排查配置和验证过程中最容易撞上几个报错。我把踩过的坑列出来你对照着看。报错一pymysql.err.OperationalError: (2003, Cant connect to MySQL server on 127.0.0.1)这是数据库连不上跟 TaoToken 无关。先确认 MySQL 服务在跑再确认host和port对不对。如果你用的是 Docker 里的 MySQL127.0.0.1可能连不到要换成容器映射的地址。另外connect_timeout设太小也可能误报先调到 10 秒试试。报错二pymysql.err.OperationalError: (1045, Access denied for user rootlocalhost)账号密码不对。检查settings.json里的user和password注意别把password写成passwd。如果密码里有特殊字符JSON 里要正确转义。报错三json.decoder.JSONDecodeErrorsettings.json格式错了常见是多了逗号、少了引号。用编辑器格式化一下或者python -m json.tool settings.json校验。报错四TaoToken 返回 401Key 无效或没带上。检查Authorization头是不是Bearer sk-xxx格式中间有空格。如果用了环境变量覆盖确认TAOTOKEN_API_KEY真的被读到了可以print(cfg[taotoken][api_key][:6])看前几位。报错五TaoToken 返回 404base_url拼错了。正确是https://taotoken.net/api请求路径再拼/v1/chat/completions。别在 base_url 末尾多加/v1否则会变成/v1/v1/...。报错六requests.exceptions.ConnectTimeout网络到 TaoToken 超时。先确认本机网络正常再把timeout调大一点。如果一直超时去接入文档核对最新的接口路径https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。排查顺序建议先看报错类型数据库还是 API再看是连接层还是认证层最后看参数拼写。大部分问题都在参数拼写上。6. 把配置收拢之后走到这里你的settings.json已经把 pymysql 连接参数和 TaoToken 通道配置统一管理起来了。数据库那边照常用DictCursor拿字典结果增删改记得conn.commit()API 那边通过https://taotoken.net/api统一入口调用Key 用环境变量兜底。一个实用小技巧把settings.json加进.gitignore再提交一份settings.example.json作为模板团队协作时别人照着填就行不会泄露 Key。另外cursorclass这种字符串到类的映射建议单独放一个常量字典别散在代码里。如果你后面要长期跑编码任务或者接 Agent可以看看 Coding Plan 的额度方案https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。需要管理多个 Key 或查看用量控制台在 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 新建 Key 走 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。配置这件事收拢到一处之后改起来是真的省心。