psql脚本能否嵌入连接命令?\c命令与SQL配合报错如何解决
可以在psql脚本中嵌入\c这类连接元命令,你遇到的报错是psql的元命令解析规则导致的,并非不支持嵌入。
报错原因
psql的元命令默认以换行作为结束标识,当你在交互式环境中一次性粘贴包含\c和后续SQL语句的多行内容时,部分版本的psql会误将下一行SQL的起始内容识别为\c命令未输入完成的host、port参数,因此会将ALL解析为端口值抛出对应报错。如果是通过psql -f 脚本文件的方式执行脚本,psql默认逐行解析,不会出现该问题。
解决方案
可选择以下任意一种方法适配所有运行场景:
- 方法一:在
\c命令后额外添加一个空行,强制psql识别元命令结束,不会读取后续行内容作为参数。修改后脚本示例:
\set username steve \c pubkey :username GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO :username; GRANT ALL PRIVILEGES ON ALL sequences IN SCHEMA public TO :username;
- 方法二:使用conninfo字符串格式书写连接参数,明确参数范围,避免解析歧义:
\set username steve \c "dbname=pubkey user=:username" GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO :username; GRANT ALL PRIVILEGES ON ALL sequences IN SCHEMA public TO :username;
- 方法三:如果是交互式粘贴运行脚本,可以先执行
\e打开psql内置编辑器,把所有内容粘贴到编辑器中保存退出,psql会按完整脚本规则正确解析执行。
内容的提问来源于stack exchange,提问作者WestCoastProjects
相关产品推荐
相关产品推荐

