如何在PostgreSQL的psql中将\conninfo输出捕获到变量中?
解决方案
你猜的没错,\conninfo的输出确实是写入到STDERR,而psql的\o命令仅捕获STDOUT内容,所以之前的方法无效。以下是两种可行的解决思路:
方法一:在psql脚本内捕获连接信息
利用psql的shell命令执行功能,启动一个临时psql进程执行\conninfo,并将STDERR重定向到STDOUT以捕获内容:
-- 捕获当前连接信息到变量(自动继承当前连接的环境参数) \set conninfo `psql -c '\conninfo' 2>&1` -- 如果连接需要指定主机/端口,可显式传递参数 -- \set conninfo `psql -h :HOST -p :PORT -d :DBNAME -U :USER -c '\conninfo' 2>&1` -- 将连接信息作为注释写入目标SQL文件头部 \echo -- 连接信息: :conninfo > target.sql -- 后续将临时表内容追加到目标文件 \copy (SELECT sql_content FROM temp_sql_table) TO target.sql WITH (FORMAT TEXT, APPEND TRUE);
方法二:外部重定向合并输出流
如果不需要在脚本内处理,可在调用psql时将STDERR合并到STDOUT,再筛选出\conninfo的内容:
- 在psql脚本中单独输出
\conninfo:
\echo -- 连接信息开始 \conninfo \echo -- 连接信息结束 -- 后续输出生成的SQL内容 SELECT sql_content FROM temp_sql_table;
- 执行脚本时通过shell重定向并筛选:
psql -f your_script.sql 2>&1 | grep -A100 "-- 连接信息开始" | grep -B100 "-- 连接信息结束" > target.sql
内容的提问来源于stack exchange,提问作者Peter Van Biesen
相关产品推荐
相关产品推荐

