场景导入:别再让数据库“死”在后台
笔者在 N8N大学 带了 8 年学员,见过太多这样的场景:MySQL 数据库里囤积了大量业务数据,却只能靠人工定时写 SQL 脚本导出,或者写个简陋的 PHP 脚本挂服务器上跑。一旦服务器重启,或者 SQL 语法报错,整个自动链条就断了。
这不仅效率低下,更危险的是,数据是“死”的。你无法让数据库里的变更实时驱动业务,比如用户刚下单就发短信,库存低于阈值就自动补货。今天,**N8N大学** 就来手把手教你,如何利用 n8n 的 MySQL 节点,通过自定义查询,让数据库真正“活”起来,与工作流触发器深度联动。
核心实操:打通 MySQL 与 n8n 的任督二脉
要实现自定义查询与触发器的联动,我们通常采用“触发 -> 查询 -> 处理”的链路。下面的步骤将拆解这一过程。
步骤一:建立可靠的数据库连接(基石)
在使用任何查询之前,必须确保 n8n 能“摸”到你的数据库。在 n8n 的凭据(Credentials)中,配置 MySQL 节点。
这里有个硬核细节:如果数据库部署在 Docker 容器内,且 n8n 在宿主机或另一个容器中,Host 不能填 `localhost`,必须填容器的 IP 或者在 Docker Compose 中配置的服务名(Service Name)。端口默认为 3306,请务必确认防火墙放行。
步骤二:选择触发器(数据的源头)
联动的第一步是“触发”。根据业务需求,选择不同的触发器:
- Webhook 节点:适用于即时响应。比如外部系统调用一个 URL,携带参数 ID,立即触发查询。
- Schedule Trigger 节点:适用于定时任务。比如每天凌晨 1 点查询昨日新增用户数。
- n8n 表达式监听:在复杂流程中,前一个节点处理完数据后,作为参数传递给 MySQL 节点。
假设我们使用 Webhook 节点,它会生成一个 URL。我们在 Postman 或前端页面向这个 URL 发送一个包含 userId 的 POST 请求。
步骤三:编写自定义查询(核心逻辑)
这是本文的重点。很多人只会用 MySQL 节点 的默认模式(选择表、选择列),但这在复杂联动中非常受限。请切换到 Execute Query 模式。
在 SQL 文本框中,你可以编写任意复杂的原生 SQL。关键在于如何将触发器传来的参数注入 SQL。
例如,Webhook 传来的数据在 body.userId 中,你的 SQL 应该这样写:
SELECT * FROM orders WHERE user_id = {{ $json.body.userId }} AND status = 'paid';
这里的 {{ $json.body.userId }} 就是 n8n 的表达式语法。它会动态地将触发器中的数据填入查询语句,实现精准查询。
步骤四:处理结果与联动下游
查询执行后,MySQL 节点会输出一个 JSON 数组。此时,你可以通过 IF 节点 判断结果是否为空。
- 如果结果为空:触发“无订单”分支,结束流程或记录日志。
- 如果结果不为空:使用 Set 节点 提取关键字段,传递给下游的 HTTP Request(调用外部 API)或 Email 节点(发送通知)。
至此,一个从触发、查询到响应的完整闭环就搭建完成了。
避坑指南:实战中的血泪教训
在 N8N大学 的实战演练中,我们发现以下两个细节最容易导致流程失败:
1. 连接池超时(Connection Timeout)
如果你的工作流闲置时间过长,再次触发时可能会报 PROTOCOL_CONNECTION_LOST 错误。这是因为 MySQL 默认会关闭长时间不活动的连接。
解决方案:在 n8n 的 MySQL 凭据配置中,开启 Connect Timeout 选项,通常设置为 10 秒即可。更稳妥的做法是利用 n8n 的 Workflow Executions 缓存机制,确保连接保持活跃。
2. SQL 注入与参数转义
虽然 n8n 的表达式引擎会自动处理大部分类型转换,但在处理字符串参数(如用户名、备注)时,务必确保参数被正确包裹。
错误写法:WHERE name = {{ $json.name }} (如果名字包含单引号会报错)
正确写法:n8n 通常会自动处理,但为了保险,建议在节点配置中检查参数类型,或者使用预处理语句(如果节点支持)。对于 n8n 的 Execute Query 模式,直接传入字符串值通常会被安全转义,但永远不要手动拼接不可信的 SQL 片段。
FAQ 问答
Q1: 自定义查询节点支持批量插入数据吗?
A: 支持。你可以使用标准的 MySQL INSERT INTO table (col1, col2) VALUES (?, ?) 语法,或者在 Execute Query 模式下直接拼接多行 VALUES 子句。如果数据量极大,建议使用 MySQL Bulk Insert 节点(如果安装了相关插件)或分批次处理,避免单次查询过大导致数据库锁表。
Q2: 如何在查询结果中获取总行数(Total Count)?
A: 在自定义查询中,你可以同时执行两个查询,用分号隔开。例如:SELECT * FROM users LIMIT 10; SELECT COUNT(*) as total FROM users;。n8n 会将结果作为数组返回。不过更推荐的方式是:先查询数据,再在工作流中使用 Function 节点 计算数组长度,逻辑更清晰。
Q3: 为什么我的中文字符在数据库里显示为问号?
A: 这是典型的字符集编码问题。请检查两点:1. 数据库表和字段的字符集是否为 utf8mb4;2. MySQL 凭据配置中,Connection String 是否包含了 charset=utf8mb4 参数。通常在 n8n 的 MySQL 节点配置中显式指定字符集即可解决。
总结与资源
将 n8n 的 MySQL 节点与自定义查询结合,是实现企业级自动化的核心技能。它打破了应用与数据库之间的壁垒,让数据流动起来。掌握它,你就不再是一个简单的脚本执行者,而是业务逻辑的架构师。
如果你想深入学习更多 n8n 的高级用法,欢迎访问 N8N大学 (n8ndx.com),那里有更多硬核的实战案例等你来探索。记住,自动化不是目的,而是释放创造力的手段。