游乐游手机版
首页/AI热点日报/热点详情

扣子接入PostgreSQL数据库查询结构化用户数据

类型:热点整理2026-07-04
在扣子中接入PostgreSQL时,必须确保数据库具有公网IP且防火墙开放5432端口并允许外部访问;应使用官方插件并通过参数化查询有效防止SQL注入攻击;解析查询结果时需进行判空处理,同时必须注意字段名区分大小写。

要在扣子里接上 PostgreSQL,核心就四件事:数据库得能从公网访问、监听和防火墙得配对、用官方插件走参数化查询、查回来的结果要判空再按字段名(注意大小写)提取。别看步骤多,每一步踩坑都得翻车。

为啥要在扣子里连数据库?很简单,想让 Bot 拿到你业务系统里的真实数据——比如会员等级、订单记录、用户偏好标签。这样它回复才有个性化,甚至能生成动态卡片、走条件逻辑。但前提是数据库得暴露一个公网能访问的端点,并且在扣子那边配好认证和表结构映射。千万别以为在本地试通了就算完事儿。

确认 PostgreSQL 实例可被扣子服务访问

扣子的后端跑在公网上,它可没法钻进你本地局域网或者没开外网的数据库里去。所以必须保证 PostgreSQL 实例监听在 0.0.0.0:5432,而不是 127.0.0.1,同时防火墙或安全组得放行这个端口。

如果你用的是阿里云 RDS PostgreSQL,进控制台 → 实例详情 → 白名单设置,临时加一条 【0.0.0.0/0】(生产环境最好换成扣子官方的 IP 段,但目前没公开,暂时先这样)。自建服务器的话,检查一下 iptables 或 ufw 有没有拦住 5432 的入站流量。

验证监听状态的命令:netstat -tuln | grep :5432。输出里必须看到 0.0.0.0:5432*:5432,否则就算 pg_hba.conf 里配了 host all all 0.0.0.0/0 md5 也连不上。

在扣子工作流中添加 PostgreSQL 插件节点

打开 Bot 编辑页 → 工作流 → 点「+」添加节点 → 搜索“PostgreSQL” → 选择官方插件“PostgreSQL Query”。

第一次用要先授权:点击“Connect Account” → 输入完整的连接字符串,格式是:
postgresql://【用户名】:【密码】@【主机地址】:【端口】/【数据库名】

注意:主机地址不能写 localhost127.0.0.1——那是扣子服务器自己的回环地址,必须填真实的公网 IP 或域名。如果密码里包含 @/: 这类特殊字符,得先做 URL 编码再填进去。

点击 Test Connection,返回“Success”就说明绑定成功了。这个凭证会被加密存储,后面所有 Query 节点都能复用这个连接。

编写安全的参数化 SQL 查询语句

拖一个 PostgreSQL Query 节点进来,把“Operation Type”设为 Select。

在 SQL 输入框里,千万别拼接变量。比如不要写 WHERE user_id = {{input.id}},而要写成 WHERE user_id = $1,然后在下面的 Parameters 栏填上:[{{input.id}}]

Parameters 必须是 JSON 数组格式,每个元素对应 $1$2……的位置占位符。如果查询依赖多个字段,比如 SELECT * FROM users WHERE status = $1 AND created_at > $2,Parameters 就填:["active", "{{input.start_time}}"]

这一步不参数化,直接把用户输入拼进 SQL 里,扣子不会自动过滤,PostgreSQL 本身也不防注入——风险自己掂量。

解析查询结果并映射到 Bot 响应

执行成功后,输出是 JSON 数组,每条记录是一个对象。比如查询 SELECT name, level FROM users WHERE id = $1,返回 [{"name":"张三","level":"VIP3"}]

在后面的节点(比如“Send Message”)里,用语法 {{pg_query_1.result[0].name}} 拿姓名,{{pg_query_1.result[0].level}} 拿等级。

但如果结果是个空数组 [],直接 .result[0] 会报错。所以务必先用一个“Condition”节点判断 {{pg_query_1.result.length}} > 0,然后分别处理“查到”和“未找到”两种情况。

另外,字段名是区分大小写的。PostgreSQL 默认小写,如果你建表时用双引号定义了大写字段(比如 "UserName"),那就得写成 {{pg_query_1.result[0]["UserName"]}},不能用点号。

来源:https://www.php.cn/faq/2763967.html?uid=1589237

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。