想要在扣子(Coze)中接入自己的MySQL数据库并实时获取业务数据,并没有捷径可走。直接填写连接串行不通——扣子目前不支持内置数据库驱动,唯一的正确路径是通过自定义插件自行搭建桥梁。以下将一步步拆解,从权限检查到插件配置,把关键点梳理清楚。

先给结论:核心流程分为三步——确认MySQL账号权限与网络连通性、使用Node.js或Python封装一个只读查询接口、最后在扣子中注册为HTTP插件并调通。每一步都有潜在问题,我们逐一规避。
确认账号权限与网络可达性
首先登录MySQL服务器,执行一句 SELECT USER(), CURRENT_USER();。不要小看这一步,它能直接判断你是否能从外部连接。如果返回 user@localhost,说明该账号仅限本机连接,必须新建一个 host 为 % 或指定IP的账号。权限至少需要 SELECT,否则无法查询数据。
网络层面也是常见瓶颈。在计划部署插件服务的机器(如云函数或VPS)上,运行 telnet your-mysql-host 3306 检查端口是否开放。如果超时或连接被拒绝,很可能是安全组、防火墙或MySQL的 bind-address 配置未修改——默认绑定127.0.0.1,外部无法连接。在解决这些问题之前,编写代码也是徒劳。
编写符合扣子插件规范的 MySQL 查询服务
接下来需要编写一个HTTP接口,专门用于接收SQL查询请求并返回结果。扣子插件本质上就是一个可供外部调用的API,你只需将其部署在公网或内网可达的位置。以下是两种常用方案。
方法一:使用 Node.js + mysql2 快速封装(推荐)
新建一个 index.js 文件,首先安装依赖:npm init -y && npm install mysql2 express。然后写入以下代码。注意几个设计要点:使用连接池避免频繁创建连接,密码通过环境变量而不硬编码,接口仅接受 SELECT 开头的SQL,从源头防止注入。
const express = require('express');
const mysql = require('mysql2/promise');
const app = express();
app.use(express.json());
const pool = mysql.createPool({
host: process.env.DB_HOST,
port: process.env.DB_PORT || 3306,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
waitForConnections: true,
connectionLimit: 10
});
app.post('/query', async (req, res) => {
const { sql, params = [] } = req.body;
if (!sql || !sql.trim().toUpperCase().startsWith('SELECT')) {
return res.status(400).json({ error: '仅允许 SELECT 查询' });
}
try {
const [rows] = await pool.execute(sql, params);
res.json({ data: rows });
} catch (err) {
res.status(500).json({ error: err.message });
}
});
app.listen(3000);
部署前务必删除所有 console.log 及调试语句,否则日志可能泄露敏感信息(如SQL原文)。密码应通过环境变量注入,例如在云函数配置面板中设置 DB_HOST、DB_USER 等,切勿在代码中硬编码。
方法二:用 Python FastAPI(适合已有 Python 工程团队)
创建 main.py,使用 pip install fastapi uvicorn pymysql 安装依赖。核心逻辑与Node.js版本相同:定义一个 POST /query 接口,接收JSON中的 sql 和 params,执行后返回JSON列表。关键在于SQL字符串必须进行白名单校验或严格限制为预设模板,绝对不要拼接用户输入。
两种方案任选其一即可,推荐Node.js版本,因为Express生态简洁,恰好适合扣子插件的HTTP对接需求。
在扣子平台注册并配置自定义插件
服务端部署完成后,回到扣子Bot编辑页面。依次点击「插件」→「+ 创建插件」→ 选择「自定义插件」。基础信息可按需填写,例如插件名称设为“订单查询”,描述清楚用途。调用方式选择「HTTP」。
配置请求信息时需要关注以下几点:
- 请求URL填写你部署好的服务地址,例如
https://your-api.example.com/query,必须使用HTTPS(扣子要求)。 - 认证方式可选「无认证」或「Bearer Token」。若使用Token,需在服务端校验
Authorization头。 - 请求体类型选择「JSON」,然后添加参数:第一个参数名
sql,类型string,必填;第二个参数名params,类型array,必填。建议写清示例值,例如sql填SELECT order_id, status FROM orders WHERE created_at > ? ORDER BY created_at DESC LIMIT 5,params填["2024-06-01"]。
配置完成后点击「测试」,输入参数发送,检查返回格式是否为 {"data": [...]} 且状态码200。如果正常,保存插件。回到Bot工作流,在「插件节点」中拖入该插件,将用户输入的内容通过变量绑定到 params 上,即可在对话中实时查询MySQL。
整个流程是否有些绕?确实如此。但一旦走通,后续迭代会非常灵活——你可以自由封装任何查询逻辑,甚至编写多个接口分别查询不同表。这比等待平台内置数据库驱动要可靠得多。
