
1. 为什么“人话查库”这件事值得认真做一次如果你写过业务代码大概率遇到过这种场面运营同事在群里问“上周华东区退款率是多少”你放下手里的重构任务打开数据库客户端回忆表名、字段名、时间字段到底是created_at还是create_time然后拼一条带GROUP BY和CASE WHEN的 SQL。查完发截图对方回一句“那再按渠道拆一下呢”。一天被打断五次每次十分钟起步。OpenClaw 的 Skill 机制正好能治这个毛病。它允许你把“自然语言转 SQL 并执行”封装成一个可复用的能力再配合 TaoToken 的统一 API 通道把模型调用这一层也标准化。你不需要在本地折腾各种模型 SDK也不用为每个 Skill 单独配一套鉴权逻辑只要一个 Key、一个 API 地址Skill 就能拿到稳定的模型推理能力。这篇要做的就是把database-query这个 Skill 接到 TaoToken 上让“查一下上个月北京销售额”这种中文提问自动变成 SQL、自动执行、自动返回表格。适合不熟悉 SQL 的开发者、被临时取数需求打断的后端同学以及想给团队搭一个内部查数入口的人。整套配置十分钟内能跑通下面每一步都可以直接复制。2. TaoToken 前置把模型通道先打通OpenClaw Skill 本身不绑定某一家模型服务它需要一个兼容 OpenAI 接口规范的推理端点。TaoToken 提供的正是这个统一入口一个 API 地址加一个 Key就能调用多种模型省去你分别注册、分别管理额度的麻烦。先做两件事。第一去控制台创建一个 API Key建议单独建一个给 OpenClaw 用方便后续按项目排查用量。第二记下 API 地址OpenClaw 的配置里会用到。控制台入口创建和管理 Keyhttps://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteAPI Key 管理页https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite接入文档接口规范、参数说明https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteAPI 基础地址统一用https://taotoken.net/api这个地址不加任何查询参数直接填进配置文件即可。Key 的形态通常是一串以sk-开头的字符串复制后先放到环境变量里别直接写死在会被提交到 Git 的文件中。注意Key 一旦泄露要立刻在控制台吊销重建。OpenClaw 的配置文件如果放在项目目录里记得加进.gitignore。如果你还没决定用哪个模型可以先去模型对话页试一下中文理解效果确认它能把“上个月”“按地区分组”这类口语化表达解析清楚再写进 Skill 配置。模型对话体验https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite3. 可复制配置config.toml 与 settings.json 骨架OpenClaw 的配置分两层一层是全局的模型通道告诉它去哪调模型一层是 Skill 自己的数据库连接信息。下面给出两份可直接改的骨架。3.1 全局模型通道 config.toml在~/.openclaw/config.toml中写入模型提供方配置。核心是把base_url指向 TaoTokenapi_key从环境变量读取。# ~/.openclaw/config.toml [model] provider openai-compatible base_url https://taotoken.net/api api_key ${TAOTOKEN_API_KEY} default_model gpt-4o-mini timeout_seconds 60 [model.params] temperature 0.1 max_tokens 2048temperature设成 0.1 是有意的生成 SQL 需要稳定不需要发挥创意。温度高了同一个问题可能这次生成DATE_SUB、下次生成INTERVAL虽然都对但不利于你排查。3.2 Skill 数据库连接 settings.jsondatabase-querySkill 的连接信息放在它自己的配置里。路径一般是~/.openclaw/skills/database-query/settings.json。{ connections: { mysql_local: { type: mysql, host: 127.0.0.1, port: 3306, database: demo_shop, user: ${DB_USER}, password: ${DB_PASSWORD}, readonly: true, max_rows: 500 }, pg_analytics: { type: postgresql, host: 127.0.0.1, port: 5432, database: analytics, user: ${PG_USER}, password: ${PG_PASSWORD}, readonly: true, max_rows: 500 } }, default_connection: mysql_local, show_generated_sql: true }几个参数值得单独说。readonly设为true后Skill 只会执行SELECT类语句从根上挡住误删误改。max_rows限制返回行数避免一句“把订单全查出来”把内存打满。show_generated_sql打开后每次回答都会附带它生成的 SQL方便你核对——这也是排查问题的关键开关。3.3 环境变量与安装把敏感信息写进 shell 配置然后安装 Skill。export TAOTOKEN_API_KEYsk-你的Key export DB_USERreadonly_user export DB_PASSWORD你的数据库密码 npx clawhublatest install database-query安装完成后OpenClaw 启动时会自动加载这个 Skill。你可以用openclaw plugins list确认它出现在列表里。4. 验证请求一次自然语言查库的完整动作配置写完先别急着问复杂问题。用一张小表做端到端验证确认“中文 → SQL → 执行 → 返回”这条链路是通的。假设demo_shop库里有一张orders表字段包括id、region、amount、order_date。启动 OpenClaw 交互界面后输入连接 mysql_local查一下上个月每个地区的销售额按金额从高到低排正常情况下你会看到三段输出第一段是它识别到的连接和意图第二段是生成的 SQL第三段是结果表格。生成的 SQL 大致长这样SELECT region, SUM(amount) AS total_sales FROM orders WHERE order_date DATE_FORMAT(CURDATE() - INTERVAL 1 MONTH, %Y-%m-01) AND order_date DATE_FORMAT(CURDATE(), %Y-%m-01) GROUP BY region ORDER BY total_sales DESC;结果会以表格形式返回类似regiontotal_sales上海1245000北京980000深圳756000如果这一步成功了说明模型通道、Skill 加载、数据库连接三件事都没问题。接下来可以试多轮追问比如紧接着输入“把北京单独拆出来按周看”Skill 会基于上一轮上下文继续生成 SQL不需要你重复表名和条件。想验证模型本身对中文的解析能力也可以直接在模型对话页里贴一段表结构加一句提问看它生成的 SQL 是否符合预期再决定要不要调整default_model。模型对话验证https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite5. 本篇常见错排查配置过程中最容易卡住的不是 SQL 本身而是通道和权限。下面几个是我实际遇到过的。报 401 或 invalid api key。九成是环境变量没生效。config.toml里写的是${TAOTOKEN_API_KEY}如果这个变量在当前 shell 里不存在就会解析成空字符串。用echo $TAOTOKEN_API_KEY确认一下注意别把 Key 前后的引号或空格带进去。报 connection refused。数据库地址或端口不对。127.0.0.1只在数据库和 OpenClaw 跑在同一台机器时成立如果数据库在容器里要换成容器网络内的地址。另外确认数据库用户允许从当前主机连接很多默认配置只允许localhost。生成的 SQL 字段名对不上。这是 Schema 没被正确读取。检查settings.json里的database是否指向了正确的库以及该用户有没有读取元数据的权限。字段名对不上时先手动执行一次SHOW TABLES确认 Skill 看到的是同一套表。查询被拒绝提示 readonly。说明你问的问题需要写操作而readonly挡住了。这是预期行为不要为了图方便关掉它。真要写数据走单独的、有审计的连接。返回结果为空但 SQL 看着没错。多半是时间范围理解偏差。“上个月”在不同模型里可能被解析成自然月也可能被解析成“过去 30 天”。打开show_generated_sql看它到底用了哪个区间再决定是调整提问方式还是固定时间字段的解析规则。响应特别慢。先看是不是max_rows太大导致返回数据量过高再确认模型端点的网络延迟。如果只是偶尔慢可能是模型在生成复杂联表 SQL属于正常波动。6. 把它变成团队里的固定入口单机跑通只是第一步。真正省时间的是把它变成一个谁都能问的入口运营在群里 一下机器人后端不用放下手里的活。要做到这一点你需要一个长期稳定的模型通道而不是每次手动贴 Key。如果你打算把这类 Skill 用在日常编码和 Agent 流程里可以了解一下 Coding Plan它更适合需要持续调用、按周期结算的场景省去反复充值和管理多个 Key 的麻烦。Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite配置层面还有两个小建议。一是给不同数据库建不同的连接名比如mysql_prod、pg_analytics提问时明确说用哪个避免模型猜错库。二是把常用的表结构说明写进 Skill 的提示词或注释里模型对字段含义理解得越准生成的 SQL 越少出错。最后留一个我踩过的坑别把生产库的写权限账号配进去。只读账号加readonly双保险才是能长期放心用的状态。跑通之后你会发现“人话查库”真正省下的不是写 SQL 的那几分钟而是被打断后重新进入状态的那半小时。