1. 本地 Python 连 MySQL 做增删改查,为什么还要管 API Key
很多人第一次写 Python 操作 MySQL,卡住的地方往往不是 SQL 语法,而是环境:PyMySQL 装没装、字符集对不对、commit 忘了写导致数据没落库。等这套 CRUD 跑通之后,又会遇到第二个问题——项目里开始接入大模型能力,比如让 AI 帮你生成 SQL、解释报错、批量造测试数据,这时候 API Key 就散落在各个脚本里,换一个模型就要改一次代码。
这篇就聚焦一个很具体的场景:在本地开发环境里,用 PyMySQL 连接 MySQL,把增删改查四个动作完整跑一遍,同时用 TaoToken 的统一 Key 来管理模型调用凭证。TaoToken 是一个统一的大模型 API 接入平台,能让你用一个 Key 调用多种模型,适合本地开发时快速验证想法。它解决的是「凭证管理」这件事,不替代你的数据库,也不替代编辑器。
适合谁看:刚学 Python 数据库操作的新手、想给本地小工具加 AI 能力的开发者、以及被多个 API Key 搞烦的人。下面所有代码都可以直接复制到本地跑,MySQL 用你本机已有的就行,没有的话装个社区版也很快。
我试过把数据库连接和模型调用拆成两个独立模块,后面维护起来清爽很多,你可以参考这个思路。整篇会按「先跑通数据库 CRUD,再接入统一 Key,最后验证结果」的顺序来,每一步都有可复制的代码和预期输出。
2. 用 TaoToken 统一 Key 管理模型调用凭证
在写代码之前,先把凭证这件事理清楚。本地开发常见的做法是把 Key 硬编码在脚本里,或者写进.env。硬编码的问题很明显:一旦提交到 Git 就泄露了。而如果你同时用几个不同平台的模型,每个平台一套 Key、一套 Base URL,脚本里到处是 if-else,改起来很痛苦。
TaoToken 的思路是提供一个统一的入口,你只需要申请一个 Key,然后在请求里指定要用的模型 ID,就能调用不同的模型。对本地 CRUD 验证这种场景来说,好处是你不用为了「让 AI 帮我生成一条测试数据」去注册好几个平台。
具体操作路径是这样的:先到官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 了解整体能力,然后进控制台创建 API Key。控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,Key 的创建和管理都在这里。创建好的 Key 建议放进环境变量,不要写死在代码里。
如果你更习惯用命令行工具,TaoToken 也提供了 Coding Plan,适合长期做编码和 Agent 类任务,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。API 的基础地址统一是 https://taotoken.net/api ,注意这个地址不带 UTM 参数,配置的时候直接用就行。
这里要强调一点:TaoToken 是正规的 API 接入服务,不是所谓的「中转」。你拿到的 Key 就是用来正常调用模型接口的,配置方式和调用官方接口一致,只是 Base URL 换成了统一入口。这一点在排查问题时很重要,因为很多报错其实是 Base URL 写错导致的。
把 Key 准备好之后,我们回到数据库这边。整个流程分两段:第一段是纯 MySQL 的 CRUD,不涉及任何模型调用;第二段是在 CRUD 脚本里加一个「用模型生成测试数据」的小功能,验证统一 Key 能正常工作。这样拆分的好处是,出问题时你能快速定位是数据库的问题还是 API 的问题。
3. 可复制的连接配置与 CRUD 代码
先装依赖。PyMySQL 是纯 Python 实现的 MySQL 客户端,不需要编译,装起来很快:
pip install pymysql如果你还想在脚本里调用模型,再装一个 requests:
pip install requests接下来是建库建表。假设你已经有一个本地 MySQL,用户是 root,密码按你自己的来。先建一个测试库和表:
CREATE DATABASE IF NOT EXISTS demo_db DEFAULT CHARACTER SET utf8mb4; USE demo_db; CREATE TABLE IF NOT EXISTS test_table ( id VARCHAR(20) PRIMARY KEY, phone VARCHAR(20), dt VARCHAR(20) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;注意字符集用utf8mb4,避免中文或特殊字符出问题。表结构很简单,id 做主键,phone 和 dt 两个字段,够我们演示增删改查了。
然后是连接配置。建议单独放一个db_config.py,把连接参数集中管理:
# db_config.py DB_CONFIG = { "host": "localhost", "user": "root", "password": "你的密码", "database": "demo_db", "charset": "utf8mb4", "cursorclass": None # 后面按需设置 }主脚本crud_demo.py这样写:
import pymysql from db_config import DB_CONFIG def get_conn(): return pymysql.connect(**DB_CONFIG) def insert_row(conn, row_id, phone, dt): sql = "INSERT INTO test_table(id, phone, dt) VALUES (%s, %s, %s)" with conn.cursor() as cur: try: cur.execute(sql, (row_id, phone, dt)) conn.commit() print(f"插入成功: {row_id}") except Exception as e: conn.rollback() print(f"插入失败: {e}") def update_row(conn, row_id, phone): sql = "UPDATE test_table SET phone=%s WHERE id=%s" with conn.cursor() as cur: try: cur.execute(sql, (phone, row_id)) conn.commit() print(f"更新成功: {row_id}") except Exception as e: conn.rollback() print(f"更新失败: {e}") def delete_row(conn, row_id): sql = "DELETE FROM test_table WHERE id=%s" with conn.cursor() as cur: try: cur.execute(sql, (row_id,)) conn.commit() print(f"删除成功: {row_id}") except Exception as e: conn.rollback() print(f"删除失败: {e}") def select_all(conn): sql = "SELECT id, phone, dt FROM test_table" with conn.cursor() as cur: cur.execute(sql) result = cur.fetchall() for row in result: print(row) return result if __name__ == "__main__": conn = get_conn() insert_row(conn, "1001", "666", "20211210") insert_row(conn, "1002", "888", "20211211") update_row(conn, "1002", "777") delete_row(conn, "1001") print("当前数据:") select_all(conn) conn.close()这里有几个细节值得说。第一,用%s占位符而不是字符串拼接,能防 SQL 注入。第二,with conn.cursor()会自动关闭游标,比手动 close 省心。第三,增删改都要commit(),忘了写的话数据不会真正落库,这是新手最常见的坑。第四,异常时rollback(),保证事务一致性。
运行python crud_demo.py,预期输出是插入两条、更新一条、删除一条,最后打印出剩下的一条记录。如果看到类似('1002', '777', '20211211')的输出,说明 CRUD 全通了。
4. 验证请求与成功结果
数据库跑通之后,我们加一段模型调用,验证 TaoToken 的统一 Key 能正常工作。场景设定为:让模型根据表结构生成一条测试数据,然后我们把它插进数据库。
先配置环境变量,把 Key 放进去:
export TAOTOKEN_API_KEY="你的Key"然后在脚本里加一个函数:
import os import requests def generate_test_data(): api_key = os.environ.get("TAOTOKEN_API_KEY") url = "https://taotoken.net/api/v1/chat/completions" headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } payload = { "model": "你的模型ID", "messages": [ {"role": "user", "content": "表结构是 id VARCHAR(20), phone VARCHAR(20), dt VARCHAR(20),请生成一条测试数据,只返回 JSON,格式为 {\"id\":\"...\",\"phone\":\"...\",\"dt\":\"...\"}"} ] } resp = requests.post(url, headers=headers, json=payload, timeout=30) print("状态码:", resp.status_code) print("返回:", resp.text) return resp.json()调用之后,如果状态码是 200,返回体里会有choices字段,里面是模型生成的内容。你可以把这段 JSON 解析出来,再拼成 INSERT 语句插进数据库,形成「模型生成 → 数据库落库」的闭环。
这里的关键是 Base URL 用https://taotoken.net/api,路径按接口文档拼。模型 ID 填你在控制台看到的那个。如果返回 401,多半是 Key 没读到或者写错了;如果返回 404,检查一下 URL 路径。
验证成功的标志是:脚本先打印出模型返回的 JSON,然后这条数据被插入数据库,最后select_all能查到它。整个过程不需要你切换多个平台的 Key,一个环境变量就够了。
如果你只是想先验证模型能不能通,可以打开模型对话页面 https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 直接发一条消息试试,确认 Key 有效之后再回到代码里调。
5. 本篇常见报错排查
本地跑这套流程,报错基本集中在几个地方。下面按真实遇到的错误对照排查。
报错一:pymysql.err.OperationalError: (1045, "Access denied for user 'root'@'localhost'")
这是密码或用户名不对。检查db_config.py里的user和password,确认和你本地 MySQL 一致。如果你用的是 MySQL 8,注意默认认证插件可能和 PyMySQL 版本不兼容,可以在连接参数里加auth_plugin='mysql_native_password',或者把用户改成用该插件认证。
报错二:pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'localhost'")
MySQL 服务没启动,或者端口不是默认的 3306。先确认服务在跑,再检查端口。如果你改过端口,在DB_CONFIG里加port字段。
报错三:UnicodeEncodeError或中文乱码
字符集没统一。建库建表用utf8mb4,连接参数里也写charset='utf8mb4',两边要一致。
报错四:调用模型返回401 Unauthorized
Key 没读到。先确认环境变量TAOTOKEN_API_KEY在当前终端里能echo出来。如果是用 IDE 运行,注意 IDE 可能没继承你 shell 里的环境变量,需要在运行配置里单独设置。另外检查 Authorization 头是不是Bearer加空格再加 Key。
报错五:返回local proxy failed或连接超时
这类错误通常是网络层的问题。检查你的 Base URL 是不是写成了https://taotoken.net/api,路径有没有多写或少写。如果你本地配了什么网络工具,先关掉再试,避免干扰。TaoToken 的接口是直连的,不需要额外配置。
报错六:KeyError: 'choices'或reading choices相关错误
返回体里没有choices,说明请求没成功。先把resp.text完整打印出来看,通常是模型 ID 写错了,或者请求体格式不对。模型 ID 要以控制台里显示的为准。
报错七:数据插入后查不到
忘了commit()。PyMySQL 默认不开自动提交,增删改之后必须显式 commit,否则连接关闭时改动会回滚。
如果你用的是 Claude Code 这类工具做辅助开发,配置的时候要写全三件套:Base URL 填https://taotoken.net/api,Key 填你的 TaoToken Key,Model ID 填你要用的模型。三个缺一不可,少一个就会报认证或找不到模型的错。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,遇到不确定的字段可以去对照。
6. 把 Key 管好,把 CRUD 跑顺
整套流程走下来,你会发现真正花时间的不是写 SQL,而是把环境和凭证理顺。数据库这边,记住三件事:字符集统一、占位符防注入、增删改必 commit。凭证这边,把 Key 放进环境变量,Base URL 用统一入口,模型 ID 按需切换。
如果你后面要长期做编码类任务,比如让模型持续帮你写 SQL、改脚本,可以看看 Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,比每次手动调接口省事。需要新建或轮换 Key 的时候,去 API Keys 页面 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 操作就行。
最后留一个实用技巧:把db_config.py和模型调用封装成两个独立模块,CRUD 脚本只负责业务逻辑。这样以后换数据库或换模型,只改一个文件,不用满项目找连接字符串。本地开发最怕的就是改一处漏一处,模块化能帮你省下不少排查时间。