在扣子中接入postgresql需确保数据库公网可访问、正确配置监听与防火墙,并通过官方插件以参数化sql安全查询,结果需判空后按字段名(区分大小写)提取使用。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

在扣子(Coze)中接入PostgreSQL数据库,是为了让Bot能直接读取结构化用户数据(如会员等级、订单记录、偏好标签),从而实现个性化回复、动态卡片生成或条件跳转逻辑。这要求数据库暴露可访问的网络端点,并在扣子平台完成认证与表结构映射,不能仅靠本地测试连接成功就认为可用。
确认PostgreSQL实例可被扣子服务访问
扣子运行在公网环境,其后端服务无法访问你本地局域网或未开放外网的数据库。必须确保PostgreSQL实例监听在0.0.0.0:5432(而非127.0.0.1),且防火墙/安全组放行该端口。
若使用阿里云RDS PostgreSQL,请进入控制台→实例详情→白名单设置,添加 【0.0.0.0/0】(生产环境建议替换为Coze官方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://【用户名】:【密码】@【主机地址】:【端口】/【数据库名】
注意:主机地址不能写localhost或127.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"]}},不能写 .username。











